【问题标题】:Storage permission not working for Nougat存储权限不适用于 Nougat
【发布时间】:2017-08-18 06:51:23
【问题描述】:

我想为我的应用授予存储权限。我的代码在 Marshmallow 之前运行完美,在 Nougat 中唯一的问题

即使从设置中手动授予权限,以下方法在牛轧糖中总是返回 false。

private boolean checkWriteExternalPermission() {

    String permission = "android.permission.WRITE_EXTERNAL_STORAGE";
    int res = getApplicationContext().checkCallingOrSelfPermission(
            permission);
    return (res == PackageManager.PERMISSION_GRANTED);
}

我将它用于牛轧糖并允许许可,但上述方法仍然返回 false。

void storagePermission(){
    StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE);
    StorageVolume volume = sm.getPrimaryStorageVolume();
    Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
    startActivityForResult(intent, 1);

}

请帮我解决这个问题。

【问题讨论】:

  • 你为什么使用checkCallingOrSelfPermission()?当你切换到using checkSelfPermission() 时,会发生什么?
  • 还有其他方法可以检查 7+ 的权限是否授予?或者我需要为此始终填充权限对话框?

标签: android android-7.0-nougat


【解决方案1】:

您应该使用库:https://github.com/hotchemi/PermissionsDispatcher

@RuntimePermissions
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

  MainActivityPermissionsDispatcher.storagePermissionWithCheck(this);

}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// NOTE: delegate the permission handling to generated method
MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}


@NeedsPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
void storagePermission(){
StorageManager sm =(StorageManager)getSystemService(Context.STORAGE_SERVICE);
StorageVolume volume = sm.getPrimaryStorageVolume();
Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
startActivityForResult(intent, 1);

}

 @OnPermissionDenied(Manifest.permission.WRITE_EXTERNAL_STORAGE)
void showDeniedForCamera() {
  // don't allow code here
}

@OnNeverAskAgain(Manifest.permission.WRITE_EXTERNAL_STORAGE)
void showNeverAskForCamera() {
    // neverAskAgain code here
}
}

【讨论】:

  • 请详细解释这将如何解决这个问题。
【解决方案2】:

您应该添加以下代码:

public void onActivityResult(final int requestCode, int resultCode, final Intent data){
        if(requestCode==1) {
            switch (resultCode) {
                case Activity.RESULT_OK:
                    getContentResolver().takePersistableUriPermission(data.getData(),
                            Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                    break;
            }
        }
    }

【讨论】:

    猜你喜欢
    • 2016-03-14
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 2021-08-11
    相关资源
    最近更新 更多