2017-02-03 129 views
0

我是android新手。我試圖授予自定義類的權限。我有兩個接口,一個單獨的類,像這樣使用自定義類授予權限

public interface RequestPermissionsResultInterface 
{ 
    void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults); 
} 

public interface PermissionManagerInterface 
{ 
    void onPermissionGranted(String message, int requestCode); 
    void onPermissionDenied(String message, int requestCode); 
} 

public class PermissionManager 
{ 
    private Activity mActivity; 
    private static volatile PermissionManagerInterface mManagerInterface; 


    public static PermissionManager getInstance(Context context) 
    { 
     if (mPermissionManager == null) 
     { 
      synchronized (PermissionManager.class) 
      { 
       if (mPermissionManager == null) 
       { 
        mPermissionManager = new PermissionManager(context); 
       } 
      } 
     } 
     return mPermissionManager; 
    } 

    private boolean isReadStorageAllowed() 
    { 
     int result = ContextCompat.checkSelfPermission(this.mActivity, Manifest.permission.READ_EXTERNAL_STORAGE); 
     return ((result == PackageManager.PERMISSION_GRANTED)); 
    } 

    public RequestPermissionsResultInterface askPermission(
     Activity mActivity, 
     String permissionName, 
     final PermissionManagerInterface managerInterface, 
     final int requestCode) 
    { 
     boolean isReadExternalStorageAllowed = isReadStorageAllowed(); 
     if(isReadExternalStorageAllowed == false) 
     { 
      if (ActivityCompat.shouldShowRequestPermissionRationale(mActivity, permissionName)) 
      { 
       final AlertDialog.Builder builder = new AlertDialog.Builder(mActivity); 
       builder.setMessage("Please allow all permissions in App Settings for additional functionality."); 
       builder.setCancelable(false); 
       builder.setPositiveButton("Allow", new DialogInterface.OnClickListener() { 
        public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) { 
         managerInterface.onPermissionGranted("Permission Granted", requestCode); 
        } 
       }); 
       builder.setNegativeButton("Deny", new DialogInterface.OnClickListener() { 
        public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) { 
         managerInterface.onPermissionDenied("Permission Denied", requestCode); 
        } 
       }); 

       final AlertDialog alert = builder.create(); 
       alert.show(); 
      } 
     } 
     else managerInterface.onPermissionGranted("Permission Already Granted", requestCode); 
    } 
} 

這裏是我如何在MainActivity

PermissionManager permManager = PermissionManager.getInstance(); 
permManager.askPermission(
      MainActivity.this, 
      Manifest.permission.READ_EXTERNAL_STORAGE, 
      mPermissionManagerInterface,    // assume this exists 
      EXTERNAL_STORAGE_PERMISSION_CODE); 

使用此類再次....這是不是永久性的。如果我允許,然後停止並重新啓動應用程序....這是再次要求我的許可。什麼可能是錯誤的?謝謝

+0

如果您是Android的新手,請嘗試按照記錄的方式執行此操作,然後再嘗試將自己的想法付諸實踐。 – Kuffs

回答

0

如果你決定去「自定義」方法,你仍然需要處理某些事情。

  1. shouldShowRequestPermissionRationale只有在您以前請求過許可並被拒絕時才爲真。您似乎正在使用它來顯示一個對話框,顯示「請授予權限」,但實際上並未要求系統顯示權限請求對話框。

  2. 實際請求權限的命令是ActivityCompat.requestPermissions。在你的代碼中看不到這個。除非您實際要求,否則用戶無法授予權限。

  3. onRequestPermissionsResult是你應該調用你的接口來說權限被授予的地方。

完整的說明在文檔中。

https://developer.android.com/training/permissions/requesting.html

+0

謝謝...那有效。但這只是問題的一部分。請參閱下面的答案。 –

+0

如果你再看一次,你會在第2點看到我說你沒有請求權限,所以我確實給你一個完整的答案。請接受\答案。 http://stackoverflow.com/help/someone-answers這不是一個論壇。謝謝 – Kuffs

+0

是的。從某種意義上說,你的答案是完整的。我(錯誤地)期待我的自定義對話框將能夠處理該問題。不是。如果我使用我的自定義對話框,我仍然需要通過ActivityCompat.requestPermissions請求權限。所以我最終顯示了兩個對話框(這是惱人的知道我的自定義對話框是毫無價值的)。我希望我有道理。仍然充分信貸給你。我沒有15個聲望,所以無法贊成。 –

0

從Android文檔

注意:當您的應用程序調用requestPermissions(),系統顯示標準對話框給用戶。您的應用程序無法配置或更改該對話框。

我試圖通過自定義對話框授予權限,這是永遠不會工作。這只是問題的一部分。

我沒有要求在自定義對話框代碼部分的權限(這將是不好的,因爲我最終顯示2個對話框:標準+我的自定義對話框)。所以我刪除我的自定義對話框並堅持到標準對話框。

榮譽去kuffs因爲他/他讓我在正確的方向。