簡體   English   中英

READ_EXTERNAL_STORAGE權限,盡管清單中有此權限,但應用程序崩潰

[英]READ_EXTERNAL_STORAGE permission, app crash despite I have this in manifest

我的權限有問題。 我該怎么做才能阻止我的應用崩潰?

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

我剛剛在我的OnCreate方法中添加了

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

似乎可行,有沒有更好的解決方案?

如果放入您的onCreate()有效,我將檢查您是否將其放在清單中的正確位置,因為這過去曾引起我問題。

確保<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />在第一個清單關閉標記之后,並且在第一個<Application ...之前<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...

嘗試這個 :

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

如果您的目標構建版本是API 23或更高版本,則只需檢查是否已授予許可。 轉到設置->應用,然后點擊您的應用。 在“權限”選項中,啟用“存儲”權限。 但這不是永久的解決方案。

好吧,我做了你想要的事情。 我給你簡單的代碼如何做到這一點:)

在這里,我檢查權限(我在片段中調用此方法,使其處於活動狀態)

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

希望此示例代碼對您有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM