2016-09-15 109 views
2

如何讓用戶有機會更改他已授予/拒絕的應用程序中的權限 ?如何更改Android M中拒絕/授予的權限?

假設用戶拒絕了權限。之後他想要授予此許可。 這可能嗎?我怎樣才能做到這一點?

+0

如果用戶選擇節目永遠那麼他/她需要把它從設置中更改否則只有我們可以應用代碼來檢查的權限,每次用戶到達該活動 –

+0

的機制是相同的;您應該存儲被拒絕的權限,您應該使用相同的方法進行詢問。 –

+0

當您執行某個需要** PERMISSION **的操作時,您必須檢查該權限,無論用戶是否已授予該權限。如果**不**,那麼您必須再次要求該許可。直到用戶授予該權限,用戶無法執行該特定任務。 –

回答

3

如果用戶拒絕了權限,您可以檢查權限,如果他也檢查過再也不顯示,那麼您可以打開自己的對話框,解釋您的應用程序需要該權限,並從該對話框中可以將用戶帶到應用程序設置中,如果他願意,他可以允許該許可。

public static void checkPermissionForExternalStorage(final Context mContext) { 

    if (Build.VERSION.SDK_INT >= 23) { 

     int writeExternalStorage = ContextCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE); 
     if (writeExternalStorage != PackageManager.PERMISSION_GRANTED) { 

      ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_ASK_PERMISSIONS_FOR_STORAGE); 
      return; 
     } 

     //Do your stuff 

    } else { 

     //Do your stuff 
    } 
} 



public static void startInstalledAppDetailsActivity(Context mContext) { 

    Intent i = new Intent(); 
    i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
    i.addCategory(Intent.CATEGORY_DEFAULT); 
    i.setData(Uri.parse("package:" + mContext.getPackageName())); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
    i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
    mContext.startActivity(i); 
} 



    @Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 

    switch (requestCode) { 



     case REQUEST_CODE_ASK_PERMISSIONS_FOR_STORAGE: 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       //Do your stuff 
      } else { 
       // Permission Denied 

       if (!ActivityCompat.shouldShowRequestPermissionRationale((Activity) mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
        showMessageOKCancel("The app was not allowed to write to your storage. Hence, it cannot function properly. Please consider granting it this permission. Tap Settings > Permissions, and turn Storage on.", 
          new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, int which) { 
            startInstalledAppDetailsActivity((Activity) mContext); 
           } 
          }); 
       } 


       Toast.makeText(mContext, "Write to external storage permission request denied.", Toast.LENGTH_SHORT).show(); 
      } 
      break; 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 
+0

現在好了。謝謝!哇,我看到你添加了代碼。這太棒了。 – lidox

+0

樂意幫忙:) – Nitesh

0

是的,你可以做到這一點。

如果您知道用戶是否授予了許可權,那麼存在回調如果onRequestPermissionsResult。如果用戶沒有授予權限,則可以在需要時再次請求相同的權限。

+0

@lodox我的答案和你接受的答案是一樣的。但我故意沒有爲你的學習設置任何代碼。但是,如果你期待勺子餵食,那沒問題。祝你好運 – Nikhil

1

你給用戶一個對話框,詢問去應用程序設置和更改權限那裏,你必須以某種方式激勵他,告訴你爲什麼需要許可。你把一個「開放設置」布頓觸發以下功能:

private void startInstalledAppDetailsActivity() { 
    final Intent i = new Intent(); 
    i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
    i.addCategory(Intent.CATEGORY_DEFAULT); 
    i.setData(Uri.parse("package:" + getPackageName())); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
    i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
    startActivity(i); 
} 
+0

感謝您的回答! :) – lidox

1

有多種方式來實現你在找什麼:

  1. 您可以創建一個單獨的View /片段只是爲了此目的徵用您的應用程序所需的所有權限,從那裏您可以撥打requestPermission()

  2. 或者,只要用戶通過調用requestPermission()打開需要運行權限的應用程序段,您可以簡單地提示用戶輸入權限。

  3. 用戶還可以從Settings嚮應用授予權限。因此,如果他希望從Settings以後,直接向用戶(例如通過對話)更改權限可能是一個好主意。