我想创建一个文件资源管理器,经过大量搜索,我发现如果没有 API 25 及更高版本的 SAF(存储访问框架),我无法在 SD 卡上修改、删除或创建文件。然后我安装了一些文件管理器测试它们是如何工作的。除了小米文件管理器,他们都使用 SAF。小米只授予权限。我截了一些截图。在此处输入图像描述 在此处 输入图像描述
编辑 1:我获得了所有运行时权限。
谢谢阅读 :)
我想创建一个文件资源管理器,经过大量搜索,我发现如果没有 API 25 及更高版本的 SAF(存储访问框架),我无法在 SD 卡上修改、删除或创建文件。然后我安装了一些文件管理器测试它们是如何工作的。除了小米文件管理器,他们都使用 SAF。小米只授予权限。我截了一些截图。在此处输入图像描述 在此处 输入图像描述
编辑 1:我获得了所有运行时权限。
谢谢阅读 :)
Android 基本上定义了三种权限: Normal Permissions Signature Permissions Dangerous Permissions
必须在 Manifest 文件中定义 Normal 和 Dangerous 权限。但是在运行时只检查危险权限,不检查正常权限。
正常权限 某些权限会自动授予应用程序。只是我们需要在 AndroidManifest.xml 中声明这些权限,它就可以正常工作。这些权限称为正常权限。正常权限的一个示例是 INTERNET。
正常权限列表:https ://developer.android.com/guide/topics/permissions/overview
签名权限 仅当请求应用程序使用与声明权限的应用程序相同的证书进行签名时,系统才会授予该权限。如果证书匹配,系统会自动授予权限,无需通知用户或请求用户明确批准。
危险权限 某些权限可能会影响用户的私人信息,或可能影响其数据或其他应用程序的运行,称为危险权限。例如,读取用户联系人的能力是一种危险的权限。其他一些示例是联系人、相机、日历、位置、电话、存储、传感器、麦克风等。
用户必须在运行时向应用授予危险权限。
这是在运行时请求危险权限的示例:-
首先,给AndroidManifest.xml文件添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
然后在运行时向用户请求许可,如下所示:-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) {
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}else {
dispatchTakePictureIntent();
}
}
然后根据您的需要覆盖 onRequestPermissionsResult 方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1){
if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "Permission Granted", Toast.LENGTH_SHORT).show();
do your stuff...
}else {
Toast.makeText(this,"Permission Denied",Toast.LENGTH_SHORT).show();
}
}
}
有关更多信息,请查看这篇文章:https ://medium.com/programming-lite/runtime-permissions-in-android-7496a5f3de55
我在 Stack Overflow 中搜索太多后找到了它,所以有一个标志可以调用该对话框并获取存储的 uri,但这种方式仅适用于 android 7 到 10。这是我问题的答案: 问题答案