簡體   English   中英

Android沒有保存到SD卡

[英]Android not saving to SD card

我想將文本文件保存到我插入運行棒棒糖的HTC One M8的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

File file = new File("/storage/ext_sd", FILENAME);

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

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

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

主外部存儲:在內置的共享存儲中,“用戶可以通過插入USB電纜並將其作為驅動器安裝在主機上”進行訪問。 示例:當我們說Nexus 5 32 GB時。

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

getExternalStorageDirectory ()

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

要訪問可移動SD(輔助外部存儲),有以下API:

getExternalFilesDirs(), getExternalCacheDirs(),getExternalMediaDirs()

查看文檔以獲取更多信息

如果Android設備在此處指導處理多個外部存儲時,我們可以使用以下代碼來檢測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" />

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

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

在這些位置之外,對於Android 4.4+附帶的設備, 您無法訪問可移動存儲

我認為這是因為HTC one修改了sdcard掛載點,你應該嘗試使用adb shell ls -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實際上是sdcard路徑。

嘗試閱讀如何獲取Android 4.0+的外部SD卡路徑? 這也許可以幫到你很多。

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卡。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM