2016-01-15 154 views
2

我试图获得棉花糖的存储权限。一切似乎都很好,我可以授予或拒绝许可。运行时权限:授权后立即没有权限

private static final int REQUEST_STORAGE = 1; 

// request storage permission 
private void requestStoragePermission() { 
    String[] permissions = new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }; 
    if (!hasStoragePermission()) { 
     Log.e(TAG, "No storage permission at the moment. Requesting..."); 
     ActivityCompat.requestPermissions(this, permissions, REQUEST_STORAGE); 
    } else 
     Log.e(TAG, "We already have storage permission. Yay!"); 
} 

// check is storage permission granted 
private boolean hasStoragePermission() { 
    String storagePermission = Manifest.permission.WRITE_EXTERNAL_STORAGE; 
    int hasPermission = ContextCompat.checkSelfPermission(this, storagePermission); 
    return (hasPermission == PackageManager.PERMISSION_GRANTED); 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_STORAGE: 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       Log.e(TAG, "Storage permission granted"); 
      } else { 
       Log.e(TAG, "Storage permission denied"); 
       Toast.makeText(getApplicationContext(), getString(R.string.no_storage_permission), Toast.LENGTH_SHORT).show(); 
      } 
      break; 
    } 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
} 

但问题出在这里。当我第一次使用此功能时,即使在授予权限后,hasStoragePermission()也始终为false。当我不得不使用上下文菜单两次以获得我想要的权限之前,未授予权限。这是不可接受的。

// some code... 
// even more code... 

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case ID_CONTEXT_MENU_SAVE_IMAGE: 
      // in order to save anything we need storage permission 
      requestStoragePermission(); 
      Log.e("SomeActivity", "storagePermissionGranted: " + hasStoragePermission()); 
      if (!hasStoragePermission()) 
       return false; 
      saveImageToDisk(mPendingImageUrlToSave); 
      break; 
    } 
    return super.onContextItemSelected(item); 
} 

Android Marshmallow有没有任何已知的错误可能导致它?代码似乎没问题,因为实际上我可以授予/拒绝存储权限。我想立即拥有它。

+0

我的问题的唯一解决方案就是把'if(mPendingImageUrlToSave!= null){saveImageToDisk(mPendingImageUrlToSave); mPendingImageUrlToSave = null; }'授予'onRequestPermissionsResult' - >权限。这是微不足道的,它可能是首选的方式。但令人讨厌的是,许可不会立即被授予... – koras

+0

以及将相同的'requestStoragePermission()' – koras

回答

2

权限请求和返回的结果是异步的。执行onRequestPermissionsResult()后,您的应用程序将被授予或拒绝该权限。在某些情况下,这会导致您的整个应用程序重新启动(某些权限)。仅供参考,外部存储应该是是其中之一,但现在M有一个问题,即在授予此权限时,应用程序并不总是重新启动。

+1

添加到Schrödinger的许可模型:D现在很明显。未重新启动但重新创建(活动)为准确。目前没有重新创建,我喜欢它。没有问题。 – koras

+0

它实际上都是 - 如果您的活动正在重新创建,那么过程重新启动。这是因为在幕后存在许多权限(如外部存储),这些权限要求将您应用的用户ID添加到特定组和SE策略上下文中。当这些更改(例如添加到组中)时,任何正在运行的进程都不会获取该更改 - 只有属于该用户标识的新进程才会获得该更改。很高兴你能够克服你遇到的问题。 –