這是一種通過Scoped Directory Access授予權限的更簡單方法,但Dialog將顯示名爲「不再詢問」的複選框。如果用戶選擇不再詢問並拒絕該請求,則來自您的應用的對於給定目錄的所有未來請求將被自動拒絕,並且不會向用戶呈現請求UI。 如果用戶遺憾或誤打了該複選框,應用程序如何補救?應用程序無法獲得權限對話框。對話框中的Android M權限問題「不要再詢問」
我們該如何處理?
這是一種通過Scoped Directory Access授予權限的更簡單方法,但Dialog將顯示名爲「不再詢問」的複選框。如果用戶選擇不再詢問並拒絕該請求,則來自您的應用的對於給定目錄的所有未來請求將被自動拒絕,並且不會向用戶呈現請求UI。 如果用戶遺憾或誤打了該複選框,應用程序如何補救?應用程序無法獲得權限對話框。對話框中的Android M權限問題「不要再詢問」
我們該如何處理?
我認爲你需要做的就是使用方法shouldShowRequestPermissionRationale(String)如果用戶拒絕了權限並選中「不要再詢問」,它將返回false。
你應該做的是顯示一條警告,解釋用戶爲什麼需要權限或執行回退,如禁用某些功能。
希望對您有所幫助。
我們應該用shouldShowRequestPermissionRationale.Please經歷這樣的:
private void insertDummyContactWrapper() {
int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.WRITE_CONTACTS);
if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
if (!shouldShowRequestPermissionRationale(Manifest.permission.WRITE_CONTACTS)) {
showMessageOKCancel("You need to allow access to Contacts",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
requestPermissions(new String[] {Manifest.permission.WRITE_CONTACTS},
REQUEST_CODE_ASK_PERMISSIONS);
}
});
return;
}
requestPermissions(new String[] {Manifest.permission.WRITE_CONTACTS},
REQUEST_CODE_ASK_PERMISSIONS);
return;
}
insertDummyContact();
}
謝謝。這shouldShowRequestPermissionRationale只用於檢查一個標誌是否設置。所以我曾經使用這個「手動需要授予設置權限」來顯示警報 –
是沒有辦法改變的標誌?
開發人員無法更改該標誌。否則,複選框沒有任何意義,因爲開發人員會通過更改標誌來忽略它。
但是,您的問題指出了作用域目錄訪問中的一個相當大的缺陷:用戶修改該標誌的能力有限。在「設置」中似乎沒有具體改變此狀態的地方,用戶可以手動授予拒絕的運行時權限的方式。
在運行7.1預覽版的Nexus 5X上,「清除數據」將重置此標誌,儘管這具有更廣泛的效果。在運行7.1的Google Pixel和運行Android 7.0的Nexus 5X上,沒有任何會重置此標誌,即使是完全卸載該應用程序。
我已經提交了關於此的a bug report。我懷疑在短期內—的情況會有很大改善,他們可能會修復它,以便「清除數據」可靠地工作。
嘿,差不多一年之後 - Google做了什麼來解決這個問題? –
@RuchirBaronia:不,因爲我可以在O Developer Previews上重新創建問題。我提交了一個新的問題(https://issuetracker.google.com/issues/36522600),這個問題剛剛被忽略。 – CommonsWare
public class AccessDenied implements View.OnClickListener{
public Dialog dialog;
private LinearLayout contentLayout;
private Activity context;
private EditText password;
private String passwordStr;
private Runnable doOnAccessPermitted;
private int wrongColor = Color.RED, defColor = Color.parseColor("#80000000");
public AccessDenied(Activity con, String pwd) {
passwordStr = pwd;
context = con;
dialog = new Dialog(context, R.style.AnimatedDialog);
setCancelable(false);
//init the dialog with content view/animations etc.
dialog.setContentView(R.layout.access_denied_layout);
contentLayout = dialog.findViewById(R.id.layoutIconDialogLinearLayout);
password = dialog.findViewById(R.id.accessdeniedlayoutpassword);
Button ok = dialog.findViewById(R.id.accessdeniedlayoutok);
ok.setOnClickListener(this);
//now the dialog is ready
}
public void setActionOnAccess(Runnable doOnAccess) {
doOnAccessPermitted = doOnAccess;
}
public void setCancelable(boolean set) {
dialog.setCancelable(set);
}
public void show() {
dialog.show();
}
public void cancel() {
dialog.cancel();
}
public void setPassword(String pwrd) {
passwordStr = pwrd;
}
public void tryPassword(String tryp) {
if(passwordStr.equals(tryp)){
cancel();
if(doOnAccessPermitted != null)
doOnAccessPermitted.run();
}
}
@Override
public void onClick(View view) {
if(passwordStr.equals(password.getText().toString())) {
cancel();
if(doOnAccessPermitted != null)
doOnAccessPermitted.run();
}else{
password.getText().clear();
Animation anim = AnimationUtils.loadAnimation(context, R.anim.edittext_shake);
anim.setDuration(200);
anim.setRepeatCount(5);
decView().startAnimation(anim);
decView().setBackgroundColor(wrongColor);
new android.os.Handler().postDelayed(new Runnable() {
@Override
public void run() {
decView().setBackgroundColor(defColor);
}
}, 1000);
}
}
private View decView() {
return password;
}
}
*如何可以補救*它可以。它可以做的是,他可以隨時改變主意,轉到「應用程序 - >設置」並授予權限。 (或者至少這是我會做的) – Blackbelt
在我的應用程序未經許可,它不會打開,所以我第一次輸入時,出現對話框。如果用戶錯誤地檢查了「不要再問了」。然後他下次進入,對話框不顯示。 PERMISSION_GRANTED獲得-1。有沒有辦法改變這個標誌? –
您接受了與[範圍目錄訪問]無關的答案(https://developer.android.com/training/articles/scoped-directory-access.html)。你確定*你的問題屬於Android 7.0的範圍目錄訪問API? – CommonsWare