【问题标题】:Getting only once permission for sdcard window on Lollipop and above version在 Lollipop 及以上版本上只获得一次 sdcard 窗口的权限
【发布时间】:2016-08-29 05:37:13
【问题描述】:

您好,我正在从 SD 卡中删除一些项目。在棒棒糖第一次我请求许可和用户授予许可,但现在我不想每次都请求许可。这非常令人恼火,他们害怕这种行为的许多人。我怎样才能保存我的许可,即下次我不需要一次又一次地通过那个 Intent

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);

谢谢

【问题讨论】:

标签: android android-5.0-lollipop delete-file android-sdcard


【解决方案1】:

我给你一些代码作为例子。请记住,您需要在 Android 6.0 上检查权限。 OnRequestPermission 是当你有权限时将在 grantResult 中执行代码的方法,如果没有,你可以请求权限或说出用户未授予权限的消息。并且此方法保存状态以获取权限

@TargetApi(23)
public void checkStoragePermission() {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        if (settingsDrawerFragment != null) {
            settingsDrawerFragment.onPermissionGranted();
        }
        return;
    }
    if (this.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager
            .PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                REQUEST_CODE_EXTERNAL_STORAGE);
        return;
    }
    if (settingsDrawerFragment != null) {
        settingsDrawerFragment.onPermissionGranted();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[]
        grantResults) {
    switch (requestCode) {
        case REQUEST_CODE_AUDIO_RECORD:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                startBrowseActivity();
            } else {
                Utils.showToast(this, getString(R.string.audio_permission_denied));
            }
            break;
        case REQUEST_CODE_EXTERNAL_STORAGE:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                if (settingsDrawerFragment != null) {
                    settingsDrawerFragment.onPermissionGranted();
                }
            } else {
                if (settingsDrawerFragment != null) {
                    closeSettingsDrawer();
                }
                Utils.showToast(this, getString(R.string.storage_permission_denied));
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            break;
    }
}

【讨论】:

  • 你知道这个 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);我希望避免此权限
  • 如果您有 onrequestPermissionsResult 方法,请检查此stackoverflow.com/questions/26744842/… - 这会保存您对应用程序的权限
  • 意图意图=新意图(意图.ACTION_OPEN_DOCUMENT_TREE); intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);意图.addFlags(意图.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);意图.addFlags(意图.FLAG_GRANT_READ_URI_PERMISSION);意图.addFlags(意图.FLAG_GRANT_WRITE_URI_PERMISSION); startActivityForResult(intent, 42); builder.dismiss();
【解决方案2】:

您可以使用以下代码来持久化权限

 getContentResolver().takePersistableUriPermission(treeUri,
            Intent.FLAG_GRANT_READ_URI_PERMISSION |
            Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

此外,一旦您保持权限,请将 uri 保存在 sharedPreference 中,以便您以后无需确认即可删除文件。

【讨论】:

  • 我将该 uri 保存在 sharedPreference 中,但手机再次重启后会出现此问题
  • 你确定你使用上面的代码来持久化权限
  • 意图意图=新意图(意图.ACTION_OPEN_DOCUMENT_TREE); intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);意图.addFlags(意图.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);意图.addFlags(意图.FLAG_GRANT_READ_URI_PERMISSION);意图.addFlags(意图.FLAG_GRANT_WRITE_URI_PERMISSION); startActivityForResult(intent, 42); builder.dismiss();
  • 在你获得uri的onactivity结果中
  • 并在 onresult 中得到这个 treeUri = data.getData();我保存这个 uri 以备下次删除
【解决方案3】:

您可以通过添加标记来启动您的意图。

 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION |
                        Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 startActivity(intent);

【讨论】:

  • 这和我的回答有什么不同
  • 接下来要做什么,比如我在现有代码中添加此代码的位置,请查看我的代码,该代码与其他用户一起在 cmets 中写入
  • 我认为你不能使用这个Intent.ACTION_OPEN_DOCUMENT_TREE意图删除文件。
猜你喜欢
  • 1970-01-01
  • 2019-04-21
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
相关资源
最近更新 更多