Android 获取MANAGE_EXTERNAL_STORAGE权限

在Android 11及以上版本中,Google引入了一项新的权限控制,即MANAGE_EXTERNAL_STORAGE权限。这个权限允许应用程序管理外部存储,包括对文件的读写等操作。但是,获取这个权限并不是那么简单,需要通过一些特殊的手段才能实现。

获取MANAGE_EXTERNAL_STORAGE权限的步骤

  1. 在AndroidManifest.xml文件中添加权限声明:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
  1. 请求MANAGE_EXTERNAL_STORAGE权限:

在Android 11及以上版本,应用程序需要通过ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION Intent来请求MANAGE_EXTERNAL_STORAGE权限:

Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
startActivityForResult(intent, 0);
  1. 处理权限请求回调:

在Activity中重写onActivityResult方法,处理权限请求的结果:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    
    if (requestCode == 0) {
        if (Environment.isExternalStorageManager()) {
            // 已经获取MANAGE_EXTERNAL_STORAGE权限
            Toast.makeText(this, "已获取MANAGE_EXTERNAL_STORAGE权限", Toast.LENGTH_SHORT).show();
        } else {
            // 未获取MANAGE_EXTERNAL_STORAGE权限
            Toast.makeText(this, "未获取MANAGE_EXTERNAL_STORAGE权限", Toast.LENGTH_SHORT).show();
        }
    }
}

示例

下面是一个简单的示例,演示了如何请求MANAGE_EXTERNAL_STORAGE权限并处理权限结果:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
            startActivityForResult(intent, 0);
        } else {
            Toast.makeText(this, "当前设备不支持MANAGE_EXTERNAL_STORAGE权限", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 0) {
            if (Environment.isExternalStorageManager()) {
                Toast.makeText(this, "已获取MANAGE_EXTERNAL_STORAGE权限", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "未获取MANAGE_EXTERNAL_STORAGE权限", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

饼状图示例

pie
    title Permissions Distribution
    "Camera" : 20
    "Storage" : 30
    "Location" : 10
    "Contacts" : 15
    "SMS" : 5
    "Others" : 20

关系图示例

erDiagram
    CUSTOMER ||--o{ ORDER : places
    ORDER ||--|{ LINE-ITEM : contains
    CUSTOMER }|..|{ DELIVERY-ADDRESS : uses

通过以上步骤,我们可以在Android应用程序中获取MANAGE_EXTERNAL_STORAGE权限,从而实现对外部存储的管理操作。但请注意,这个权限是敏感权限,只有经过用户允许后才能获取。在使用时,请遵循相关的隐私政策和最佳实践,确保用户数据的安全和隐私。