欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android11及以上文件讀寫權(quán)限申請詳細介紹

 更新時間:2022年08月06日 16:27:50   作者:有點料  
安卓11改變了此前安卓系統(tǒng)對于文件管理的規(guī)則,在安卓 11 上,文件讀寫變成了特殊權(quán)限,下面這篇文章主要給大家介紹了關(guān)于Android11及以上文件讀寫權(quán)限申請的相關(guān)資料,需要的朋友可以參考下

Android11 讀寫權(quán)限申請

Android11系統(tǒng)對應(yīng)用寫入權(quán)限做了嚴格的限制。本文介紹如何獲取文件讀寫權(quán)限。項目中 build.gradle 的targetSdkVersion >= 29 ,會出現(xiàn)讀寫問題。

當(dāng)targetSdkVersion = 29,通過設(shè)置requestLegacyExternalStorage=“true”,還能解決。

當(dāng)targetSdkVersion = 30后,需要申請所有文件權(quán)限才能獲取到寫入權(quán)限。

AndroidManifest添加權(quán)限設(shè)置

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
        tools:ignore="ScopedStorage" /><!--add 2022-2-11 Android11-->
 
<application
    ...
    android:requestLegacyExternalStorage="true" 
    ...
    >

代碼申請動態(tài)權(quán)限

1.Android 6.0之上Android11以下申請權(quán)限

 if (Build.VERSION.SDK_INT >= 23) {// 6.0
        String[] perms = {
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_PHONE_STATE};
        for (String p : perms) {
            int f = ContextCompat.checkSelfPermission(SafeKeyToolActivity.this, p);
            Log.d("---", String.format("%s - %d", p, f));
            if (f != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(perms, 0XCF);
                break;
            }
        }
    }

Android11申請權(quán)限

跳轉(zhuǎn)系統(tǒng)設(shè)置界面,用戶授權(quán)獲取權(quán)限。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !isRefuse) {// android 11  且 不是已經(jīng)被拒絕
        // 先判斷有沒有權(quán)限
        if (!Environment.isExternalStorageManager()) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
            intent.setData(Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, 1024);
        }
    }
 
// 帶回授權(quán)結(jié)果
 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1024 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    	// 檢查是否有權(quán)限
        if (Environment.isExternalStorageManager()) {
            isRefuse = false;
            // 授權(quán)成功
        } else {
            isRefuse = true;
            // 授權(quán)失敗
        }
    }
}

對于部分手機如小米手機,即使獲取了所有文件的管理權(quán)限,依舊訪問不到Android/data目錄,如圖:

嘗試解決辦法:

只在外部存儲的應(yīng)用私有目錄下,用直接路徑讀寫文件。

訪問或者共享媒體文件,使用MediaStore在公共目錄下讀寫文件

訪問或者共享非媒體文件,使用系統(tǒng)的文件選擇器SAF在公共目錄Download下讀寫文件。

根目錄下可以創(chuàng)建自定義文件夾、文件。

補充:Android 11 及以上申請外部存儲權(quán)限

升級 targetSdkVersion

android 
    defaultConfig {
        targetSdkVersion 30
    }
}

添加清單權(quán)限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

代碼動態(tài)申請

public final class PermissionActivity extends AppCompatActivity {

    private static final int REQUEST_CODE = 1024;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestPermission();
    }

    private void requestPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            // 先判斷有沒有權(quán)限
            if (Environment.isExternalStorageManager()) {
                writeFile();
            } else {
                Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
                intent.setData(Uri.parse("package:" + context.getPackageName()));
                startActivityForResult(intent, REQUEST_CODE);
            }
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 先判斷有沒有權(quán)限
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
                    ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                writeFile();
            } else {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
            }
        } else {
            writeFile();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
                    ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                writeFile();
            } else {
                ToastUtils.show("存儲權(quán)限獲取失敗");
            }
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            if (Environment.isExternalStorageManager()) {
                writeFile();
            } else {
                ToastUtils.show("存儲權(quán)限獲取失敗");
            }
        }
    }

    /**
     * 模擬文件寫入
     */
    private void writeFile() {
        ToastUtils.show("寫入文件成功");
    }
}

總結(jié)

到此這篇關(guān)于Android11及以上文件讀寫權(quán)限申請的文章就介紹到這了,更多相關(guān)Android11文件讀寫權(quán)限申請內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論