【问题标题】:READ_EXTERNAL_STORAGE permission, app crash despite I have this in manifestREAD_EXTERNAL_STORAGE 权限,应用程序崩溃,尽管我在清单中有这个
【发布时间】:2016-08-21 23:59:21
【问题描述】:

我的权限有问题。我应该怎么做才能阻止我的应用崩溃?

MainActivity.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 android:name="android.permission.READ_EXTERNAL_STORAGE" />

【问题讨论】:

标签: java android android-permissions android-external-storage


【解决方案1】:

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

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

而且似乎有效,有没有更好的解决方案?

【讨论】:

  • 是的,您应该处理用户未授予权限时发生的情况。请参阅文档。此外,如果没有必要,您应该仅在需要权限时才请求权限,而不是在 onCreate 中,因为这样用户会更容易理解您要求的内容和原因。
【解决方案2】:

如果放入您的 onCreate() 有效,我会检查您是否将其放入清单中在正确的位置,因为这在过去曾给我造成过问题。

确保&lt;uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /&gt;在第一个清单结束标记之后和第一个&lt;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...

【讨论】:

  • 但是如果你的目标是 API 23 或更高版本,你必须在你的代码中明确请求该权限(即在运行时)。这并不难,谷歌在他们的网站上的某个地方有相应的文档。
【解决方案3】:

试试这个:

  //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
     }

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

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

      此检查权限与自动消息 我也制作 onRequestPermissions

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-16
        • 1970-01-01
        • 2016-12-22
        • 2018-07-17
        • 1970-01-01
        • 2017-06-01
        • 1970-01-01
        • 2023-03-30
        相关资源
        最近更新 更多