如何使用Oreo将我的应用写在SD卡上

时间:2019-07-15 09:42:27

标签: android

我在运行Android Oreo的外部sd卡上写一个奇怪的问题:

首先是常用命令     getExternalFilesDir(null).getAbsolutePath() 要么     Environment.getExternalStorageDirectory()。getAbsolutePath()

返回仿真存储的路径,而不是有时称为辅助外部存储的真实SD卡。

但这不是问题,因为我设法使用帖子末尾所述的getExternalStoragePath()方法来获取SD卡的路径。

现在奇怪的是,我无法获得创建目录的应用程序(例如,软件包为com.example.myapp)

SDCARDPATH / Android / data / com.example.myapp / files

尽管已正确授予了所有必要的授权(但WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE可能仅适用于仿真存储,但我感觉存在问题!)这就是我正在做的事情:

String SDCARDPATH=getExternalStoragePath(this, true);
File md = new File(new File(new File(new    File(SDCARDPATH,"Android"),"data"),PACKAGE_NAME),"files");
if(!md.exists()) {
                try {
                    md.mkdirs();
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }

奇怪的是,如果我通过电话文件浏览器手动创建目录,则该应用程序可以在该目录中进行写入和读取而没有任何麻烦。

所以我的问题是如何在外部sdcard上正确创建该目录

旁注,我发现手机上安装的某些应用程序已设法在SD卡上创建了它们的应用程序目录。

最后是我使用的getExternalStoragePath方法,该方法是在网上抓取的:

感谢所有人的帮助,

Lea

 public static String getExternalStoragePath(Context mContext, boolean is_removable) {

    StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
    Class<?> storageVolumeClazz = null;
    try {
        storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
        Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
        Method getPath = storageVolumeClazz.getMethod("getPath");
        Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
        Object result = getVolumeList.invoke(mStorageManager);
        final int length = Array.getLength(result);
        for (int i = 0; i < length; i++) {
            Object storageVolumeElement = Array.get(result, i);
            String path = (String) getPath.invoke(storageVolumeElement);
            boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
            if (is_removable == removable) {
                return path;
            }
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
    return null;
}

1 个答案:

答案 0 :(得分:0)

  

我设法使用帖子末尾描述的getExternalStoragePath()方法来获取SD卡的路径

该代码不适用于所有版本的Android。特别是,它不适用于Android 10+。如果它同样在Android 9.0上失败,我也不会感到惊讶,因为它依赖于反射到系统类中。在不存在这些类和方法的较旧设备上,该操作也会失败。

  

首先,通常的命令getExternalFilesDir(null).getAbsolutePath()或Environment.getExternalStorageDirectory()。getAbsolutePath()返回仿真存储的路径,而不是有时称为辅助外部存储的真实SD卡

使用getExternalFilesDirs()(注意末尾的s)。返回File[]。如果该数组具有2个以上的元素,则除第一个元素外,所有元素都指向可移动存储上的目录,您可以在没有任何权限的情况下从应用程序使用它们。该目录应该已经创建,但是您可以在mkdirs()上调用File以确保它存在。