2015-03-25 128 views
3

我想保存一個文本文件到我插入我的HTC One M8運行棒棒糖的SD卡上。但是,當我運行這段代碼時,它會保存到內部存儲器中。Android沒有保存到SD卡

String FILENAME = "mysavefile.txt"; 

    File file = new File(Environment.getExternalStorageDirectory(), FILENAME); 

    if (isExternalStorageWritable()) { 
     errorSD.setVisibility(View.INVISIBLE); 
     try { 
      FileOutputStream fos = new FileOutputStream(file, false); 
      fos.write(allInformation.getBytes(), 0, 81); 
      fos.close(); 
      successfulSubmissionToast(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
      errorSD.setVisibility(View.VISIBLE); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

應當保存至

/storage/ext_sd 

而是它保存到

/storage/emulated/0 

然後我試圖在我的SD卡的位置,手動輸入,看看是否會工作但它最終拋出FileNotFoundException

​​

編輯: 我相信問題是有多個外部存儲。一個是永久的,一個是臨時的。問題是你如何訪問第二個。

+1

您是否試過閱讀[使用外部存儲]的文檔(htt電話號碼://developer.android.com/guide/topics/data/data-storage.html#filesExternal)? – alanv 2015-03-25 01:59:48

+0

是的,我有很多次,但我找不到解決我的問題。我知道外部存儲並不總是指SD卡,但如果沒有,我該如何保存到SD卡? – jtreiner 2015-03-25 02:06:34

+0

在內部存儲器的哪個位置保存文件? – 2015-03-25 02:24:14

回答

2

首先,我們需要了解內部存儲,外部存儲(又稱爲主外部存儲)和輔助外部存儲之間的區別。

內部存儲:是用戶無法訪問的存儲,除非是通過安裝的應用程序(或通過爲其設備生根)。示例:data/data/app_packageName

主外部存儲:內置共享存儲「用戶可以通過插入USB電纜並將其作爲驅動器安裝到主機上來訪問」。例如:當我們說Nexus 5 32 GB時。

輔助外部存儲:可移動存儲。例如:SD卡。

getExternalStorageDirectory() 

它將返回主要外部存儲目錄的路徑

訪問可移動SD(二次外部存儲)有如下的API:

getExternalFilesDirs(), getExternalCacheDirs(),getExternalMediaDirs()

檢查有文檔更多信息

-1

我認爲這是因爲HTC修改了SD卡掛載點,您應該嘗試使用adb shellls -l命令找出sdcard掛載的路徑。

例如在的Nexus 4:

lrwxrwxrwx root  root    2015-03-24 18:26 sdcard -> /storage/emulated/legacy 
drwxr-x--x root  sdcard_r   2015-03-24 18:26 storage 

,你應該確保它是不是一個鏈接:ls -l /storage/emulated/legacy

lrwxrwxrwx root  root    2015-03-24 18:26 legacy -> /mnt/shell/emulated/0 

路徑/mnt/shell/emulated/0實際上是SD卡路徑。

嘗試閱讀How can I get external SD card path for Android 4.0+?太,這可能會幫助你很多。

UPDATE

我試過這段代碼:

String test = "/storage/emulated/legacy"; // work 
    //String test = "/mnt/shell/emulated/legacy"; // not work 
    File sdDir = new File(test); 
    if (sdDir.exists()) { 
     File file = new File(test, "test.sdcard"); 
     try { 
      file.createNewFile(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

所以你最好儘量/storage/emulated/*目錄找出這正好是你的SD卡。

+0

實際上,不,您不能使用ADB外殼來查找應用程序的某些內容,因爲ADB與應用程序的座標不同。但是您可以使用文件管理器應用程序或終端模擬器,因爲它們(至少到目前爲止)對於不同的應用程序通常是相同的。 – 2015-03-25 02:29:10

+0

我用了一個文件管理器,發現/ storage/ext_sd是SD卡的地方。/storage/emulated/0不是SD卡。我知道這是因爲我刪除了SD卡,而/ storage/ext_sd消失時仍然存在。 – jtreiner 2015-03-25 02:34:21

+0

根據您的目標可能有所幫助 - 即它是給定設備上給定Android版本的答案。但絕不是便攜式答案。您也可能會發現您無權以這種方式訪問​​它。 – 2015-03-25 02:38:12

1

如果Android設備在這裏跟着guide在處理多個外部存儲時,我們可以使用以下代碼來檢測Android kitkat或更高版本的數據寫入位置。

final String APP_EXTERNAL_CACHE = "Android" + File.separator + "data" 
      + File.separator + getPackageName() + File.separator + "cache"; 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     for (File file : getExternalCacheDirs()) { 
      if (file != null) { 
       String mountPoint = file.getAbsolutePath().replace(APP_EXTERNAL_CACHE, ""); 

       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
        if (Environment.isExternalStorageRemovable(file)) { 
         Log.d(TAG, "removable external " + file.getAbsolutePath()); 
        } 
        if (Environment.isExternalStorageEmulated(file)) { 
         Log.d(TAG, "emulated internal " + file.getAbsolutePath()); 
        } 
       } else { 
        if (mountPoint.contains("emulated")) { 
         Log.d(TAG, "emulated internal " + mountPoint); 
        } else { 
         Log.d(TAG, "removable external " + mountPoint); 
        } 
       } 
      } 
     } 
    } 

並聲明清單中的相關權限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
1

我想一個文本文件保存到我插入我的HTC One M8的SD卡運行棒棒糖

歡迎您來嘗試getExternalFilesDirs()getExternalCacheDirs()getExternalMediaDirs()Context。請注意方法名稱的複數形式。對於這些方法,如果它們返回多個條目,則第二個和後續條目應位於可移動介質上,指向您可以讀取和寫入的目錄,而不需要任何特別許可(例如,WRITE_EXTERNAL_STORAGE)。

在這些位置之外,對於Android 4.4+,you have no access to removable storage附帶的設備。