2016-01-15 195 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策略上下文中。當這些更改(例如添加到組中)時,任何正在運行的進程都不會獲取該更改 - 只有屬於該用戶標識的新進程纔會獲得該更改。很高興你能夠克服你遇到的問題。 –