【问题标题】:Android 6.0 runtime permission + intent filterAndroid 6.0 运行时权限+意图过滤器
【发布时间】:2016-06-08 07:49:51
【问题描述】:

我需要访问我的意图过滤器中的存储,以在 Android 6.0 应用程序中获取 pdf 文件或图像。

[IntentFilter(new[] { Intent.ActionOpenDocument, Intent.ActionView }, Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable }, DataMimeType = "application/pdf")]
[IntentFilter(new[] { Intent.ActionOpenDocument, Intent.ActionView }, Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable }, DataMimeType = "image/jpeg")]
[IntentFilter(new[] { Intent.ActionOpenDocument, Intent.ActionView }, Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable }, DataMimeType = "image/png")]

但是,它需要用户授予应用的存储权限。

问题是这种情况是否有任何适当的 POC,我可以阻止意图、显示警报,然后根据授予/撤销权限完成我的意图?

目前我假设我只能显示一些没有权限的 toast,并温和地要求用户进入应用程序并手动启用权限(通过一些自定义应用程序设置或其他方式)。

【问题讨论】:

  • 请具体说明您的需求??有点混乱

标签: android android-intent xamarin.android android-permissions intentfilter


【解决方案1】:
   private static final int REQUEST_RUNTIME_PERMISSION = 1;

     void checkPremission() {
            //Desired permission you want
            final String permission = Manifest.permission.CAMERA;
                // if in fragment use getActivity()

            if (ContextCompat.checkSelfPermission(ActivityName.this, permission)
                    != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(ActivityName.this, permission)) {

                } else {
                    ActivityCompat.requestPermissions(ActivityName.this, new String[]{permission}, REQUEST_CAMERA_PERMISSION);
                }
            } else {
                // you have permission go ahead

            }
        }

        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            switch (requestCode) {
                case REQUEST_RUNTIME_PERMISSION:
                    final int numOfRequest = grantResults.length;
                    final boolean isGranted = numOfRequest == 1
                            && PackageManager.PERMISSION_GRANTED == grantResults[numOfRequest - 1];
                    if (isGranted) {
                        // you have permission go ahead
                    }else{
                        // you dont have permission show toast
                    }
                    break;
                default:
                    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            }
        }

【讨论】:

    【解决方案2】:
    private void requestPermission() {
    
        int writePermission = ContextCompat.checkSelfPermission(
                MyActivity.this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (writePermission != PackageManager.PERMISSION_GRANTED) {
    
            // Should we show an explanation?
            // if (ActivityCompat.shouldShowRequestPermissionRationale(
            // MyActivity.this,
            // Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            //
            // // Show an expanation to the user *asynchronously* -- don't
            // // block
            // // this thread waiting for the user's response! After the user
            // // sees the explanation, try again to request the permission.
            //
            // } else {
    
            // No explanation needed, we can request the permission.
    
            ActivityCompat
                    .requestPermissions(
                            MyActivity.this,
                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                            MY_PERMISSIONS_WRITE_TO_EXTERNAL_STORAGE);
    
            // MY_PERMISSIONS_WRITE_TO_EXTERNAL_STORAGE is an
            // app-defined int constant. The callback method gets the
            // result of the request.
            // }
        }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_WRITE_TO_EXTERNAL_STORAGE: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    
                    // permission was granted, yay! Do the
                    // permission-related task you need to do.
    
                } else {
    
                    MyActivity.this.finish();
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                }
                return;
            }
    
            // other 'case' lines to check for other
            // permissions this app might request
        }
    }
    

    我在这里使用了 WRITE_EXTERNAL_STORAGE 权限,因为它授予了读写权限。

    在您需要的地方调用requestPermission() 方法,然后从您的设备中获取pdf 或图像。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      感谢您的回答,但也许我忘了在问题中提及它,但我标记了它 - 我正在寻找 Xamarin 技术的答案。

      时间过去了,但在那之前,我们终于找到了解决办法。更多的是这样的代码:

              private bool HandlAndroidRuntimePermissions(Intent intent)
              {
                  const int toastTimeout = 5;
                  const string permissionName = "File Drop";
      
                  try
                  {
                      PermissionStatus status;
                      using (var checkPermissionStatusAsync = CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Storage))
                      {
                          status = checkPermissionStatusAsync.Result;
                      }
      
                      if (status != PermissionStatus.Granted)
                      {
                          using (var shouldShowRequestPermissionRationaleAsync = CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Storage))
                          {
                              if (shouldShowRequestPermissionRationaleAsync.Result)
                              {
                                  UserDialogs.Instance.Toast(
                                      string.Format(Core.Resources.Resource.DocumentPickerModalViewModel_AndroidPermissionWrapper_RequestPermissionRationale, Permission.Storage, permissionName),
                                      TimeSpan.FromSeconds (toastTimeout));
                              }
                          }
      
                          using (var requestPermissionsAsync = CrossPermissions.Current.RequestPermissionsAsync(Permission.Storage))
                          {
                              requestPermissionsAsync.ContinueWith(task =>
                              {
                                  var permissionStatuses = task.Result;
                                  status = permissionStatuses[Permission.Storage];
                                  if (status == PermissionStatus.Granted)
                                  {
                                      CopyDocumentFromDeviceToMyLibrary(intent);
                                  }
                                  UserDialogs.Instance.Toast(string.Format(Core.Resources.Resource.DocumentPickerModalViewModel_AndroidPermissionWrapper_PermissionNotGrant, Permission.Storage, permissionName),
                                      TimeSpan.FromSeconds (toastTimeout));
                              });
                          }
                          return true;
                      }
                  }
                  catch (Exception)
                  {
                      UserDialogs.Instance.Toast(string.Format(Core.Resources.Resource.DocumentPickerModalViewModel_AndroidPermissionWrapper_ErrorOccured, Permission.Storage),
                          TimeSpan.FromSeconds (toastTimeout));
                      return true;
                  }
      
                  return false;
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-13
        • 2016-12-22
        • 1970-01-01
        • 2016-01-13
        • 2015-05-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多