在Android 10上运行时,我如何授予存储目录_下载的权限? 我的问题
我有一个针对API 30的Android应用程序,它将数据文件存储在公共目录中,供用户访问并复制到其他地方自己的目录 这适用于API 28及以下版本,也适用于API 30,但不适用于访问被拒绝的API 29 到目前为止我做了什么 我研究了这里的各种帖子,包括回答API 29/Android 10主题的经验丰富的用户的答案,以及Android开发者的相关主题,但无法找到我问题的具体答案(或我能理解的答案)。我在Kotlin中看到了一些例子——我熟悉Java,但不熟悉Kotlin 我的代码中有什么 在我的清单中:在Android 10上运行时,我如何授予存储目录_下载的权限? 我的问题,android,android-permissions,android-10.0,android-external-storage,Android,Android Permissions,Android 10.0,Android External Storage,我有一个针对API 30的Android应用程序,它将数据文件存储在公共目录中,供用户访问并复制到其他地方自己的目录 这适用于API 28及以下版本,也适用于API 30,但不适用于访问被拒绝的API 29 到目前为止我做了什么 我研究了这里的各种帖子,包括回答API 29/Android 10主题的经验丰富的用户的答案,以及Android开发者的相关主题,但无法找到我问题的具体答案(或我能理解的答案)。我在Kotlin中看到了一些例子——我熟悉Java,但不熟悉Kotlin 我的代码中有什么
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
在我的Java代码中:
我的主要类包括以下全局变量:
public static File dataDir;
public static File fileSaveDir;
在其他模块中,我有:
Spine.dataDir = getFilesDir();
Spine.fileSaveDir =
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
以及保存文件的代码:
// Default toast text
toastText = "Failed to save file";
// [code to build fileName snipped]
// Create the output file
outFile = new File(Spine.fileSaveDir, fileName);
try
{
out = new BufferedWriter(new FileWriter(outFile), 1024);
// Output the formatted body
// [code snipped]
// Flush and close file
out.flush();
out.close();
// File has been saved
toastText = "File saved as " + formatDesc;
}
catch (IOException e)
{
toastText += "\n" + e.getMessage();
}
在API 29上运行时,尝试创建BufferedWriter时会引发异常。否则,在其他API级别上,一切正常。我到处寻找这个问题的解决办法,但一直找不到
在Android Studio中的API 29模拟器上运行时,实际的toast文本输出为:
Failed to save file
/storage/emulated/0/Download/
20210520.txt: open failed : EACCES
(Permission denied)
解决方案(感谢响应者)是在清单的应用程序部分添加android:requestLegacyExternalStorage=“true”,同时仍以API 30为目标
在我所有的测试中,我把它放在清单的错误部分,这就是为什么我不能让它工作的原因。有时你需要运行时权限才能写入外部存储
if (ContextCompat.checkSelfPermission(Main_activity.this),
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
if (!ActivityCompat.shouldShowRequestPermissionRationale(OMain_activity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
ActivityCompat.requestPermissions(getActivity(),
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
1);
}
}
请求清单文件中的旧外部存储。我现在不在计算机旁(现在已经很晚了),但我以前在清单中有这个,我很确定它没有解决问题。我的目标是API 29还是API 30都没有区别。不管怎样,我明天会再次检查。已排序-请在Shazniq的答案中查看我的答案和我的评论。谢谢。是的,我也读过,但不幸的是它没有帮助。由于targetSdkVersion 30
,requestLegacyExternalStorage属性将无法工作。试着确认一下:如果您将其更改为targetSdkVersion 29
,那么我认为它会起作用。我不知道它是否相关,但您的build.gradle文件显示targetSdkVersion 30--您可能想更改它,我假设您在清单中设置了28或更少,因为您的问题是“这适用于api 28及以下版本”。不,您假设错误。目标Sdk设置为30时,它适用于除29以外的所有版本。否。Target 30和请求遗留外部存储对于Android 10设备有效。我的主要活动的OnCreate函数中已经有非常类似的代码,除了它既结合了WraveExtAlpLyStand和Access FieleLoad的请求之外,还没有添加代码,这就是为什么我认为这是问题。我引用的代码只是与API 29有关(具体地说)不起作用。如果没有您在这里提到的代码,所有这些都不会起作用!:-)无论如何,谢谢你抽出时间。好的,没问题。
<application
android:requestLegacyExternalStorage="true"
....
if (ContextCompat.checkSelfPermission(Main_activity.this),
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
if (!ActivityCompat.shouldShowRequestPermissionRationale(OMain_activity.this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
ActivityCompat.requestPermissions(getActivity(),
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
1);
}
}