Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 外部存储器中应用程序自身目录的路径_Android_Android External Storage - Fatal编程技术网

Android 外部存储器中应用程序自身目录的路径

Android 外部存储器中应用程序自身目录的路径,android,android-external-storage,Android,Android External Storage,在库中,我想返回一个文件,该文件表示应用程序在外部存储器中的自有目录,即通过此方法返回的目录: context.getExternalFilesDir(null); 但在API级别19之前使用此方法,需要WRITE\u EXTERNAL\u STORAGE权限,我不想强制用户使用此权限,特别是我的方法只想返回抽象文件,不想创建目录 我可以使用以下代码: Environment.getExternalStorageDirectory().getCanonicalPath() + "/Androi

在库中,我想返回一个文件,该文件表示应用程序在外部存储器中的自有目录,即通过此方法返回的目录:

context.getExternalFilesDir(null);
但在API级别19之前使用此方法,需要
WRITE\u EXTERNAL\u STORAGE
权限,我不想强制用户使用此权限,特别是我的方法只想返回抽象文件,不想创建目录

我可以使用以下代码:

Environment.getExternalStorageDirectory().getCanonicalPath() + "/Android/data/" + packageName + "/files";

但是我认为硬编码是不安全的。有没有一种方法可以在不强制用户使用
写入
权限的情况下返回该目录?

如果要避免硬编码字符串,可以尝试使用reflect

    Class<?> environmentClass = Environment.class;
    try {
        Field androidDirectoryField = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            androidDirectoryField = environmentClass.getDeclaredField("DIR_ANDROID");
        } else {
            androidDirectoryField = environmentClass.getDeclaredField("DIRECTORY_ANDROID");
        }
        androidDirectoryField.setAccessible(true);
        final String externalDir = Environment.getExternalStorageDirectory().getAbsolutePath() 
                + getFilesDir().getAbsolutePath().replaceFirst("data", androidDirectoryField.get(null).toString());

        Log.d(TAG, "external directory " + externalDir);
    } catch (NoSuchFieldException | IllegalAccessException | IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
Class-environmentClass=Environment.Class;
试一试{
字段androidDirectoryField=null;
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.KITKAT){
androidDirectoryField=environmentClass.getDeclaredField(“DIR_ANDROID”);
}否则{
androidDirectoryField=environmentClass.getDeclaredField(“目录_ANDROID”);
}
androidDirectoryField.setAccessible(true);
最后一个字符串externalDir=Environment.getExternalStorageDirectory().getAbsolutePath()
+getFilesDir().getAbsolutePath().replaceFirst(“数据”,androidDirectoryField.get(null.toString());
Log.d(标记“外部目录”+externalDir);
}捕获(NoSuchFieldException | IllegalAccessException | IllegalArgumentException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}

此方法使用一个声明的字段
DIRECTORY\u ANDROID
,这是一个隐藏的api,不知道将来是否会更改。是的,不保证以后不会更改。另外
字段androidDirectoryField=environmentClass.getDeclaredField(“DIRECTORY\u ANDROID”)
抛出
NoSuchFieldException
在最新版本中,它更改为
DIR\u ANDROID
,请看,这些是隐藏的API。