有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java读取外部存储权限,应用程序崩溃,尽管我在清单中有此项

我的权限有问题。我应该如何阻止我的应用程序崩溃

主要活动。爪哇

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

    Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(intent, 1);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == 1 && resultCode == RESULT_OK  && data != null){
        Uri selectedImage = data.getData();
        try {
            Bitmap bitmap =  MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage);
            ImageView imageView = (ImageView)findViewById(R.id.imageView);
            imageView.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

AndroidManifest。xml

<uses-permission 安卓:name="安卓.permission.READ_EXTERNAL_STORAGE" />

共 (5) 个答案

  1. # 1 楼答案

    我做你想做的事。我给你简单的代码,如何做到这一点:)

    在这里我检查权限(我在片段中调用这个方法,在活动中创建它)

    @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;
        }
    }
    

    记住在活动中制定方法。请检查一下

    最后,我做了这样的事情来检查片段中的权限

     public void setHomeStreamSource(int position) {
        if (position == STORAGE_CLOUD_CACHE) {
            preferenceHelper.putInt(getString(R.string.preferences_usb_prefs), getString(R.string
                    .preferences_video_source), MainActivity.SOURCE_CLOUD);
            closeDrawer();
            Utils.showToast(activity, getString(R.string.source_selected));
        } else if (position == STORAGE_USB) {
            ((MainActivity) activity).checkStoragePermission();
        }
    }
    

    希望这个示例代码对你有帮助

  2. # 2 楼答案

    我刚刚在OnCreate方法中添加了这个

    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 225);
    

    这似乎有效,有没有更好的解决方案

  3. # 3 楼答案

    如果您的目标构建版本是API 23或更高版本,只需检查是否授予了该权限。 转到设置->;应用,然后点击你的应用。在权限选项中启用存储权限。但这并不是永久的解决方案

  4. # 4 楼答案

    如果把你的onCreate()作品放进去,我会检查你是否把它放在清单的正确位置,因为这在过去给我带来了麻烦

    确保<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />在第一个清单结束标记之后,在第一个<Application ...之前

    例如:

     <?xml version="1.0" encoding="utf-8"?>
        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="net.mypackagename">
    
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />    
    
        <application...
    
  5. # 5 楼答案

    试试这个:

      //check permission is granted or no    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) 
         {
          requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, RESULT_LOAD_IMG);
         } 
        else
         {
        //your code
         }