2017-02-03 7 views
0

私はアンドロイドを初めて利用しています。私はカスタムクラスからアクセス許可を与えようとしています。私はこのカスタムクラスを使用して許可を付与する

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

のような二つのインターフェースとシングルトンクラスを、持っているそして、ここで私は再び

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

MainActivity

でこのクラスを使用する方法です....それは永続的ではありません。私が許可を与えたら、もう一度アプリケーションを停止して再起動してください....これは私にもう一度許可を求めています。何が問題なの?ありがとう

+0

Androidを初めてお使いの場合は、自分のスピンを入れようとする前に、文書化された方法で試してみてください。 – Kuffs

答えて

0

「カスタム」メソッドを実行することに決めた場合は、依然として特定のものを処理する必要があります。

  1. shouldShowRequestPermissionRationaleあなたは以前に許可を要求してきたし、それを拒否された場合にのみ当てはまります。あなたは "許可を与えてください"というダイアログを表示するのに、実際にシステムに許可要求ダイアログを表示するように要求していないようです。

  2. 実際にアクセス許可を要求するコマンドはActivityCompat.requestPermissionsです。あなたのコードでこれを見ることができません。ユーザーが実際に要求しない限り、ユーザーは許可を与えることはできません。

  3. onRequestPermissionsResultここでは、許可が与えられたとのインターフェースを呼び出す必要があります。

完全な説明はドキュメントにあります。 Androidのドキュメントから

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

+0

ありがとうございました。しかし、それは問題の一部に過ぎませんでした。下の私の答えを見てください。 –

+0

もう一度見てみると、2点目に私があなたに許可を要求していないと述べたので、私はあなたに完全な答えを与えました。受諾して答えを投票してください。 http://stackoverflow.com/help/someone-answersこれはフォーラムではありません。ありがとうございます – Kuffs

+0

はい。ある意味では、あなたの答えは完全です。私は(間違って)私のカスタムダイアログがそれを処理できると期待していました。そうではありませんでした。私のカスタムダイアログを使用する場合、私はまだActivityCompat.requestPermissionsを通じてアクセス許可を要求する必要があります。だから私は2つのダイアログボックスを表示することになります(これは私のカスタムダイアログが役に立たないことを迷惑にしています)。私は理にかなっているといい。あなたにはまだフルクレジット。私は15の評判を持っていないので、upvoteすることはできません。 –

0

注:アプリケーションが)(requestPermissionsを呼び出すと、システムがユーザに対して標準のダイアログボックスを示しています。あなたのアプリは、そのダイアログボックスを設定または変更することはできません。

私は決して動作しないカスタムダイアログを通じて許可を得ようとしていました。これは問題の一部に過ぎませんでした。

私はカスタムダイアログコードセクション(私は2つのダイアログ:標準+私のカスタムダイアログを表示することになったので悪くなっていただろう)でパーミッションを要求していませんでした。だから私は私のカスタムダイアログを削除し、標準のものに固執する。

名誉はカフスに私は正しい方向に私を置くので。

関連する問題