2016-11-17 127 views
4

這是一種通過Scoped Directory Access授予權限的更簡單方法,但Dialog將顯示名爲「不再詢問」的複選框。如果用戶選擇不再詢問並拒絕該請求,則來自您的應用的對於給定目錄的所有未來請求將被自動拒絕,並且不會向用戶呈現請求UI。 如果用戶遺憾或誤打了該複選框,應用程序如何補救?應用程序無法獲得權限對話框。對話框中的Android M權限問題「不要再詢問」

我們該如何處理?

+2

*如何可以補救*它可以。它可以做的是,他可以隨時改變主意,轉到「應用程序 - >設置」並授予權限。 (或者至少這是我會做的) – Blackbelt

+0

在我的應用程序未經許可,它不會打開,所以我第一次輸入時,出現對​​話框。如果用戶錯誤地檢查了「不要再問了」。然後他下次進入,對話框不顯示。 PERMISSION_GRANTED獲得-1。有沒有辦法改變這個標誌? –

+0

您接受了與[範圍目錄訪問]無關的答案(https://developer.android.com/training/articles/scoped-directory-access.html)。你確定*你的問題屬於Android 7.0的範圍目錄訪問API? – CommonsWare

回答

1

我認爲你需要做的就是使用方法shouldShowRequestPermissionRationale(String)如果用戶拒絕了權限並選中「不要再詢問」,它將返回false。

你應該做的是顯示一條警告,解釋用戶爲什麼需要權限或執行回退,如禁用某些功能。

希望對您有所幫助。

0

我們應該用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(); 
    } 
+0

謝謝。這shouldShowRequestPermissionRationale只用於檢查一個標誌是否設置。所以我曾經使用這個「手動需要授予設置權限」來顯示警報 –

3

是沒有辦法改變的標誌?

開發人員無法更改該標誌。否則,複選框沒有任何意義,因爲開發人員會通過更改標誌來忽略它。

但是,您的問題指出了作用域目錄訪問中的一個相當大的缺陷:用戶修改該標誌的能力有限。在「設置」中似乎沒有具體改變此狀態的地方,用戶可以手動授予拒絕的運行時權限的方式。

在運行7.1預覽版的Nexus 5X上,「清除數據」將重置此標誌,儘管這具有更廣泛的效果。在運行7.1的Google Pixel和運行Android 7.0的Nexus 5X上,沒有任何會重置此標誌,即使是完全卸載該應用程序。

我已經提交了關於此的a bug report。我懷疑在短期內—的情況會有很大改善,他們可能會修復它,以便「清除數據」可靠地工作。

+0

嘿,差不多一年之後 - Google做了什麼來解決這個問題? –

+1

@RuchirBaronia:不,因爲我可以在O Developer Previews上重新創建問題。我提交了一個新的問題(https://issuetracker.google.com/issues/36522600),這個問題剛剛被忽略。 – CommonsWare

0
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; 
    } 
}