TShopping

 找回密碼
 註冊
搜索
查看: 1842|回復: 0
打印 上一主題 下一主題

[教學] [Android智慧型手機設計_External storage:存取行動裝置的記憶體]

[複製鏈接]
跳轉到指定樓層
1#
發表於 2013-6-10 20:18:57 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook


可以將檔案儲存在可移除儲存媒體上(例如:SD卡),這種方式稱為外部儲存,說明如下:

私有的外部檔案:儲存在「/sdcard/Android/data/<package_name>/files/」,會隨著應用程式被移除而一同移除

公開的外部檔案:儲存在「/sdcard/」,不會隨著應用程式被移除而一同移除

建立外部檔案說明如下:

1.呼叫Environment的getExternalStorageState()檢查該儲存媒體是否處於可被存取的狀態
2.建立私有的外部檔案:呼叫Context的getExternalFilesDir()
3.建立公開的外部檔案:呼叫Environment的getExternalStoragePublicDirectory()
4.呼叫MediaScannerConnection的scanFile()啟動媒體掃描器,掃描是否有新的檔案
5.存取外部儲存媒體必須設定:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


設計Ch7_5_ExternalStorage.java

  1. public class Ch7_5_ExternalStorage extends Activity {
  2. ImageView iv;
  3. Button btn1,btn2;
  4. TextView tv2;
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.main);
  9. btn1=(Button)findViewById(R.id.button1);
  10. btn2=(Button)findViewById(R.id.button2);
  11. iv=(ImageView)findViewById(R.id.imageView1);
  12. tv2=(TextView)findViewById(R.id.textView2);
  13. //私有的外部檔案:儲存在「/sdcard/Android/data/<package_name>/files/」,會隨著應用程式被移除而一同移除
  14. btn1.setOnClickListener(new OnClickListener(){

  15. @Override
  16. public void onClick(View v) {
  17. File path=getExternalFilesDir(Environment.DIRECTORY_PICTURES);
  18. File file=new File(path,"baby00.jpg");
  19. CreatFile(file);
  20. }});
  21. //公開的外部檔案:儲存在「/sdcard/」,不會隨著應用程式被移除而一同移除
  22. btn2.setOnClickListener(new OnClickListener(){

  23. @Override
  24. public void onClick(View v) {
  25. File path=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
  26. File file=new File(path,"baby00.jpg");
  27. CreatFile(file);
  28. }});
  29. }
  30. void CreatFile(File file){
  31. File parentPath=file.getParentFile();
  32. if(!isSDExist())
  33. {
  34. Toast.makeText(this, "SD卡不存在", Toast.LENGTH_LONG).show();
  35. }
  36. try {
  37. if(!parentPath.exists())
  38. parentPath.mkdir();
  39. if(file.exists())
  40. file.delete();
  41. InputStream is=getResources().openRawResource(R.drawable.baby00);
  42. OutputStream os=new FileOutputStream(file);
  43. byte data[]=new byte[is.available()];
  44. is.read(data);
  45. os.write(data);
  46. Toast.makeText(this, "儲存成功", Toast.LENGTH_LONG).show();
  47. tv2.setText("檔案儲存於"+file.toString());
  48. is.close();
  49. os.close();
  50. } catch (Exception e) {
  51. Log.d("Ch7_5_EnternalStorage","例外發生: "+e.toString());
  52. }
  53. }
  54. public boolean isSDExist()
  55. {
  56. String state=Environment.getExternalStorageState();
  57. if(state.equals(Environment.MEDIA_MOUNTED))
  58. return true;
  59. else
  60. return false;
  61. }
  62. }
複製代碼



建立外部檔案時可以指定欲儲存之目錄類型:
DIRECTORY_ALARMS:存放鬧鐘鈴聲
DIRECTORY_DCIM:存放拍攝的相片或視訊檔案
DIRECTORY_DOWNLOADS:存放下載的檔案
DIRECTORY_MOVIES:存放電影檔案
DIRECTORY_MUSIC:存放音樂檔案
DIRECTORY_NOTIFICATIONS:存放通知鈴聲
DIRECTORY_PICTURES:存放相片檔案
DIRECTORY_PODCASTS:存放podcasts檔案
DIRECTORY_RINGTONES:存放來電鈴聲

如果要讓圖片掃描至Gallery刷新紀錄

新增方法
  1. void callMediaScanner(String paths[]){
  2. MediaScannerConnection.scanFile(MainActivity.this, paths, null, new MediaScannerConnection.OnScanCompletedListener() {
  3. public void onScanCompleted(String path, Uri uri) {
  4. Log.i("ExternalStorage.java", "Scanned"+path);
  5. }
  6. });
  7. }
複製代碼

並在is.close();
os.close();下加
  1. String paths[]={file.toString()};
  2. callMediaScanner(paths);
複製代碼




 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-4-25 06:56 , Processed in 0.062673 second(s), 25 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表