使用自定义类授予权限

时间:2017-02-03 14:01:29

标签: android android-permissions

我是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);

再次......它不是持久的。如果我给予许可,那么再次停止并重新启动应用程序....这是再次请求我的许可。可能有什么不对?感谢

2 个答案:

答案 0 :(得分:0)

如果你决定采用“自定义”方法,你仍然需要处理某些事情。

  1. shouldShowRequestPermissionRationale仅在您之前已请求许可且被拒绝时才为真。您似乎正在使用它来显示一个对话框,说“请授予权限”,但实际上并没有要求系统显示权限请求对话框。

  2. 实际请求权限的命令是ActivityCompat.requestPermissions。在您的代码中看不到这一点。除非您确实要求,否则用户无法授予权限。

  3. onRequestPermissionsResult是您应该呼叫您的界面以表示授予权限的地方。

  4. 文档中有完整的说明。

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

答案 1 :(得分:0)

来自Android文档

  

注意:当您的应用调用requestPermissions()时,系统会向用户显示标准对话框。您的应用无法配置或更改该对话框。

我试图通过自定义对话框授予权限,该对话框永远不会起作用。这只是问题的一部分。

我没有在自定义对话框代码部分中请求权限(这本来很糟糕,因为我最终显示了2个对话框:标准+我的自定义对话框)。所以我删除了我的自定义对话框并坚持使用标准对话框。

Kudos去了 kuffs ,因为他/她让我朝着正确的方向前进。