簡體   English   中英

盡管已授予WRITE_EXTERNAL_STORAGE,但ContextCompat.checkSelfPermission返回-1

[英]ContextCompat.checkSelfPermission returns -1 despite WRITE_EXTERNAL_STORAGE granted

在電話設置中,授予權限。 搭載Android 8.0的手機。

compileSdkVersion 28
minSdkVersion 16
targetSdkVersion 28

清單具有:

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

在我的代碼中,此“ permissions”變量始終等於-1:

int permissions = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);

從Android 6(API 23)開始,您還必須在運行時請求此權限。 該視頻可能會有所幫助: https : //youtu.be/WGz-alwVh8A

好的,感謝Larry Schiefer的運行時權限。

考慮到android docs:

鏈接1 鏈接2

我從鏈接2對該方法進行了一些更改。在執行某些操作之前,它會檢查權限,並在必要時要求用戶確認,在其他情況下,它會強制設置權限。

    public void requestRuntimePermission(final Context context, final String manifestPermission, final int requestCode) {

        int permissions = ContextCompat.checkSelfPermission(context, manifestPermission);
        if (permissions != PackageManager.PERMISSION_GRANTED) {

            if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context,
                    manifestPermission)) {

                android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(context);
                builder.setMessage("Allow access?")
                        .setCancelable(true)
                        //Cancel
                        .setNegativeButton("Yes", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                            }
                        })
                        //Ok
                        .setPositiveButton("No", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                ActivityCompat.requestPermissions((Activity) context,
                                        new String[]{manifestPermission},
                                        requestCode);
                            }
                        });
                android.support.v7.app.AlertDialog alert = builder.create();
                alert.show();

            } else {
                // Permission has not been granted yet. Request it directly.
                ActivityCompat.requestPermissions((Activity) context, new String[]{manifestPermission},
                        requestCode);
            }

        }
    }

用法示例:

requestRuntimePermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE, 0);

requestRuntimePermission中的PS requestCode參數可用於標識onRequestPermissionsResult回調中允許的權限。 鏈接3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM