日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Android 11 適配存儲(chǔ)權(quán)限

作者:安果移不動(dòng) 更新時(shí)間: 2022-05-12 編程語(yǔ)言

?升級(jí)到11后

targetSdkVersion 30

?權(quán)限又原來(lái)的兩個(gè)變?yōu)榱巳齻€(gè)




在原先的基礎(chǔ)上面新增了這個(gè)全新啊

MANAGE_EXTERNAL_STORAGE

?

這個(gè)權(quán)限的目的是為了

該權(quán)限將授權(quán)讀寫(xiě)所有共享存儲(chǔ)內(nèi)容,這也將同時(shí)包含非媒體類型的文件。但是獲得這個(gè)權(quán)限的應(yīng)用還是無(wú)法訪問(wèn)其他應(yīng)用的應(yīng)用專屬目錄 (app-specific directory),無(wú)論是外部存儲(chǔ)還是內(nèi)部存儲(chǔ)。

但是這個(gè)MANAGE_EXTERNAL_STORAGE權(quán)限和存儲(chǔ)的倆權(quán)限 授權(quán)其中一個(gè)就好了。。不然還會(huì)報(bào)錯(cuò)

所以正確做法應(yīng)當(dāng)是。android11申請(qǐng)11的權(quán)限。低于11的那么就還是按照原來(lái)的去申請(qǐng)

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) {
            // 先判斷有沒(méi)有權(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) {
            // 先判斷有沒(méi)有權(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("存儲(chǔ)權(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("存儲(chǔ)權(quán)限獲取失敗");
            }
        }
    }

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

XXPermissions 提供了簡(jiǎn)單的權(quán)限申請(qǐng)。

    // JitPack 遠(yuǎn)程倉(cāng)庫(kù):https://jitpack.io
        maven { url 'https://jitpack.io' }
    api 'com.github.getActivity:XXPermissions:13.5'

申請(qǐng)這個(gè)權(quán)限就不用申請(qǐng)其他的了

?這個(gè)jetpck的插件幫我們完成了

    val permission0 = Permission.ACCESS_FINE_LOCATION;
        val permission2 = Permission.READ_PHONE_STATE;
        val permission3 = Permission.MANAGE_EXTERNAL_STORAGE;

        if (XXPermissions.isGranted(activity, permission0, permission2, permission3)
        ) {
            onOver()
            return
        }
        XXPermissions.with(activity)
            // 申請(qǐng)單個(gè)權(quán)限
            .permission(permission0)
            // 申請(qǐng)多個(gè)權(quán)限
            .permission(permission2)
            .permission(permission3)
            // 設(shè)置權(quán)限請(qǐng)求攔截器(局部設(shè)置)
            //.interceptor(new PermissionInterceptor())
            // 設(shè)置不觸發(fā)錯(cuò)誤檢測(cè)機(jī)制(局部設(shè)置)
            //.unchecked()
            .request(object : OnPermissionCallback {

                override fun onGranted(permissions: MutableList, all: Boolean) {
               
                }

                override fun onDenied(
                    permissions: MutableList,
                    never: Boolean
                ) {
                  
                }
            })

在對(duì)應(yīng)多個(gè)權(quán)限申請(qǐng)的時(shí)候就可以彈出如上代碼

我們沒(méi)有對(duì)android12

做判斷。但是框架為我們做了。

參考?2022-02-24 Android R11 之后外部存儲(chǔ)權(quán)限獲取,Android R11 里將會(huì)引入一個(gè)特別的權(quán)限叫做 MANAGE_EXTERNAL_STORAGE,跟之前的版本有區(qū)別。_海月汐辰的博客-CSDN博客_manage_external_storage

Android 11 存儲(chǔ)權(quán)限適配指南_雪舞飛影的博客-CSDN博客_android 存儲(chǔ)權(quán)限?

GitHub - getActivity/XXPermissions: Android 權(quán)限請(qǐng)求框架,已適配 Android 12

原文鏈接:https://blog.csdn.net/mp624183768/article/details/124672782

欄目分類
最近更新