簡體   English   中英

SD卡上的Android KitKat 4.4文件夾

[英]Android KitKat 4.4 folder on sd card

我們剛剛違反了適用於在Android 4.4上將文件寫入SD卡(外部存儲)的新權限(EACCES權限被拒絕)

在KitKat之前,我們設置了可寫文件夾,如下所示:

mfolder = Environment.getExternalStorageDirectory().getPath() + "/appfiles";

然而,經過幾個小時的搜索,我得出結論,無論是對還是錯,在4.4設備上啟用文件寫入需要將其更改為:

mfolder = Environment.getExternalStorageDirectory().getPath() + "/Android/data/com.xyz.abc/appfiles";

所以mfolder會是這樣的:/mnt/sdcard/Android/data/com.xyz.abc/appfiles

這是正確的,我們是否在sdcard上創建了一個像上面那樣的文件夾來啟用4.4設備來寫文件?

mfolder是我們保存為共享首選項的String。

然后,如果API> = 19,我們將運行此代碼,該代碼將更改mfolder String,然后將舊文件夾中的所有文件復制到新的“kitkat”文件夾。

if (android.os.Build.VERSION.SDK_INT>=19){
        if (!mfolder.contains("/Android/data/com.xyz.abc/appfiles")){
            if (prefs.getBoolean("kitkatcheck", false)==false){

                //update mfolder from
                      // /mnt/sdcard/appfiles
                      // to
                      // /mnt/sdcard/Android/data/com.xyz.abc/appfiles
                String prekitkatfolder = mfolder;
                String kitkatfolder = mfolder.replace("/appfiles", "/Android/data/com.xyz.abc/appfiles");
                mfolder = kitkatfolder;
                try {
                    File sd = new File(mfolder);
                    if(!sd.exists() || !sd.isDirectory()) {
                        sd.mkdirs();
                    }
                } catch (Exception e) {
                    Toast.makeText(getBaseContext(), "Error creating Kitkat folder!\n" + e.toString(), Toast.LENGTH_LONG).show();
                    return;
                }
                prefEditor.putString("patternfolder", mfolder);
                prefEditor.putBoolean("kitkatcheck", true);
                prefEditor.commit();

                //copy files and folder from old appfiles folder to new.
                AllFiles.clear();
                listFilesAndFilesSubDirectories(prekitkatfolder);
                if (AllFiles.size()>0){
                    for (File child : AllFiles ) {
                        try {

                            File dest = new File(child.toString().replace(prekitkatfolder, kitkatfolder));


                            try {
                                String filePath = dest.getPath().substring(0, dest.getPath().lastIndexOf(File.separator));
                                File subfolder = new File(filePath);
                                if(!subfolder.exists() || !subfolder.isDirectory()) {
                                    subfolder.mkdirs();
                                }
                            } catch (Exception ex) {
                            }

                            copyFile(child, dest);  

                        } catch (Throwable t) {

                        }
                    }

                }


            }

        }

然后我通知用戶他們的文件已被復制到新文件夾,並且由於新的權限,他們必須手動刪除舊的prekitkatfolder文件夾。 我想如果他們有一個股票文件管理器,或者如果他們沒有安裝SD卡並將其放在PC中,由於新的4.4權限,他們只會這樣做?

此外,對我們來說,這些4.4權限似乎並未影響我們所有使用Kitkat的用戶。 有些人仍然可以寫入其外部存儲器上的原始文件夾位置,有些人會收到EACCES(權限被拒絕)錯誤。 任何人都可以解釋為什么會這樣,人們會認為這適用於使用外部存儲的所有4.4設備嗎?

由於我們沒有實際的4.4設備,我們必須使用模擬器(API 19)測試此代碼,但我們沒有得到EACCES Permission Denied錯誤。 所以我們發布了一個帶有上面代碼的測試版,並且已經被告知復制的文件最終在內部存儲中,這怎么可能呢?

任何想法,我們做錯了,提前謝謝

更新解決方案

這將設置並在KitKat的正確位置創建文件夾。

mfolder = this.getExternalFilesDir("asubfoldername").getAbsolutePath();

但是,這不是完全證明,如果Android設備同時具有內部和外部輔助存儲位置,則上面將使用內部存儲位置。 不是我們想要的,因為我們需要可移動SD卡的路徑,或者更好的是具有最多可用空間的輔助存儲位置的路徑。

File[] possible_kitkat_mounts = getExternalFilesDirs(null);

注意getExternalFilesDirs末尾的“s”。 這將創建一系列輔助外部存儲位置。

for (int x = 0; x < possible_kitkat_mounts.length; x++) {
    //Log.d("test", "possible_kitkat_mounts " + possible_kitkat_mounts[x].toString());
    boolean isgood=false;
    if (possible_kitkat_mounts[x] != null){
        isgood = test_mount(possible_kitkat_mounts[x].toString());  
        if (isgood==true){
            arrMyMounts.add(newymounts(Device_get_device_info(possible_kitkat_mounts[x].toString()), possible_kitkat_mounts[x].toString()));
        }   
    }
}                           

//sort arrMyMounts size so we can use largest
Collections.sort(arrMyMounts, new Comparator<mymounts>(){
    public int compare(mymounts obj1, mymounts obj2){
        return (obj1.avaliablesize > obj2.avaliablesize) ? -1: (obj1.avaliablesize > obj2.avaliablesize) ? 1:0 ;
    }
}); 


if (arrMyMounts.size()>0){
    mfolder = arrMyMounts.get(0).name + "/asubfoldername";
    //Log.d("test", "selected kitkat mount " + kitkatfolder);   
}else{
    //do something else...
}

從possible_kitkat_mounts數組中,我們通過test_mount檢查是否可以實際寫入所選位置,如果成功,我們將該位置添加到arrMyMounts。

通過對arrMyMounts進行排序,我們可以獲得具有最多可用空間的位置。

嘿presto,arrMyMounts.get(0).name是一個kitkat輔助存儲位置,具有最大的可用空間。

Google已阻止Android 4.4中對外部存儲設備的寫入權限。 在他們改變之前,沒有辦法在沒有root的情況下將其還原。

更多信息: https//groups.google.com/forum/#! msg/ android-platform/ 14VUiIgwUjY/ UsxMYwu02z0J

它可能適用於Kitkat的某些設備,它們帶有minisd卡插槽。 這很令人困惑:(

暫無
暫無

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

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