棉花糖权限错误



我正在开发音乐播放器应用程序,所以我必须从存储卡中获取所有歌曲,我成功地从存储卡应用程序中获取了歌曲,并在棒棒糖上运行良好。

问题棉花糖运行时权限我还为棉花糖添加了运行时权限,但应用程序仍然崩溃。。

这是我的完整代码,请告诉我在哪里可以写棉花糖的运行时权限。

public class MainActivity extends AppCompatActivity {
private int STORAGE_PERMISSION_CODE = 23;
ListView musiclist;
Cursor musiccursor;
int music_column_index;
int count;
MediaPlayer mMediaPlayer;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init_phone_music_grid();
if(isReadStorageAllowed()){
//If permission is already having then showing the toast
Toast.makeText(MainActivity.this,"You already have the permission",Toast.LENGTH_LONG).show();
//Existing the method with return
return;
}
//If the app has not the permission then asking for the permission
requestStoragePermission();
}
private void requestStoragePermission() {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.READ_EXTERNAL_STORAGE)){
//If the user has denied the permission previously your code will come to this block
//Here you can explain why you need this permission
//Explain here why you need this permission
}
//And finally ask for the permission
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},STORAGE_PERMISSION_CODE);
}
//This method will be called when the user will tap on allow or deny
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
//Checking the request code of our request
if(requestCode == STORAGE_PERMISSION_CODE){
//If permission is granted
if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
//Displaying a toast
Toast.makeText(this,"Permission granted now you can read the storage",Toast.LENGTH_LONG).show();
}else{
//Displaying another toast if permission is not granted
Toast.makeText(this,"Oops you just denied the permission",Toast.LENGTH_LONG).show();
}
}
}

private boolean isReadStorageAllowed() {
int result = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);

if (result == PackageManager.PERMISSION_GRANTED)
return true;

return false;
}

private void init_phone_music_grid() {
System.gc();
String[] proj = { MediaStore.Audio.Media._ID,
MediaStore.Audio.Media.DATA,
MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Video.Media.SIZE };
musiccursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
proj, null, null, null);
count = musiccursor.getCount();
musiclist = (ListView) findViewById(R.id.PhoneMusicList);
musiclist.setAdapter(new MusicAdapter(getApplicationContext()));
musiclist.setOnItemClickListener(musicgridlistener);
mMediaPlayer = new MediaPlayer();
}
private AdapterView.OnItemClickListener musicgridlistener = new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView parent, View v, int position,
long id) {
System.gc();
music_column_index = musiccursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
musiccursor.moveToPosition(position);
String filename = musiccursor.getString(music_column_index);
try {
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.reset();
}
mMediaPlayer.setDataSource(filename);
mMediaPlayer.prepare();
mMediaPlayer.start();
} catch (Exception e) {
}
}
};

public class MusicAdapter extends BaseAdapter {
private Context mContext;
public MusicAdapter(Context c) {
mContext = c;
}
public int getCount() {
return count;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {

System.gc();
TextView tv = new TextView(mContext.getApplicationContext());
String id = null;
if (convertView == null) {
music_column_index = musiccursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);
musiccursor.moveToPosition(position);
id = musiccursor.getString(music_column_index);
music_column_index = musiccursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE);
musiccursor.moveToPosition(position);
id += " Size(KB):" + musiccursor.getString(music_column_index);
tv.setText(id);
} else
tv.setTextColor(Integer.parseInt(String.valueOf(R.color.colorAccent)));
tv = (TextView) convertView;
return tv;
}
}}

请不要标记重复,请更正我的许可感谢

碰撞报告:E/AndroidRuntime:致命异常:main流程:com.example.j.musicapp,PID:28606java.lang.RuntimeException:无法启动活动ComponentInfo{com.example.j.musicapp/com.example.j.msusicapp.MainActivity}:java.lang.SecurityException:拒绝权限:读取com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=28606,uid=10161需要android.Permission.READ_external_STORAGE或grantUriPermission()在android.app.ActivityThread.performLaunchActivity(ActivityThreads.java:3319)在android.app.ActivityThread.handleLaunchActivity(ActivityThreads.java:3415)在android.app.ActivityThread.access1100美元(ActivityThreads.java:229)在android.app.ActivityThread$H.handleMessage(ActivityThreads.java:1821)在android.os.Handler.dispatchMessage(Handler.java:102)在android.os.Looper.loop(Looper.java:148)在android.app.ActivityThread.main(ActivityThreads.java:7331)位于java.lang.reflect.Method.ioke(本机方法)网址:com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)网址:com.android.internal.os.ZygoteInit.main(ZygoteNit.java:1120)引起原因:java.lang.SecurityException:拒绝权限:从pid=28606读取com.android.providers.media.MediaProvider uri content://media/external/audio/media,uid=10161需要android.Permission.READ_external_STORAGE或grantUriPermission()在android.os.Parcel.readException(Parcel.java:1621)位于android.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)位于android.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)在android.content.ContentProviderProxy.query(ContentProviderNative.java:421)在android.content.ContentResolver.query(ContentResolver.java:502)在android.content.ContentResolver.query(ContentResolver.java:445)在android.app.Activity.managedQuery(Activity.java:2227)网址:com.example.j.musicapp.MainActivity.init_phone_music_grid(MainActivity.java:100)网址:com.example.j.musicapp.MainActivity.onCreate(MainActivity.java:35)在android.app.Activity.performCreate(Activity.java:6904)在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136)在android.app.ActivityThread.performLaunchActivity(ActivityThreads.java:3266)在android.app.ActivityThread.handleLaunchActivity(ActivityThreads.java:3415)在android.app.ActivityThread.access1100美元(ActivityThreads.java:229)在android.app.ActivityThread$H.handleMessage(ActivityThreads.java:1821)在android.os.Handler.dispatchMessage(Handler.java:102)在android.os.Looper.loop(Looper.java:148)在android.app.ActivityThread.main(ActivityThreads.java:7331)位于java.lang.reflect.Method.ioke(本机方法)网址:com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)网址:com.android.internal.os.ZygoteInit.main(ZygoteNit.java:1120)

这是棉花糖及以上版本的示例代码:

public static class Utility {
public static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 123;
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public static boolean checkPermission(final Context context) {
int currentAPIVersion = Build.VERSION.SDK_INT;
if (currentAPIVersion >= android.os.Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.READ_EXTERNAL_STORAGE)) {
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context, R.style.MyAlertDialogStyle);
alertBuilder.setCancelable(true);
alertBuilder.setTitle("Permission necessary");
alertBuilder.setMessage("External storage permission is necessary");
alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
}
});
AlertDialog alert = alertBuilder.create();
alert.show();
} else {
ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE);
}
return false;
} else {
return true;
}
} else {
return true;
}
}
}

这是一种检查读取外部存储的权限的方法。请参考代码并进行相应操作。希望这能帮到你。

也可以在onCreate方法中添加此代码

boolean result = Utility.checkPermission(MainActivity.this);

您可以查看这个通用代码结构,看看是否匹配。。。我实际上遵循了它,运行良好

if(permissionNotGranted){
requestPermission() ;
}else{
//Permission granted, good to go!
doWhateverWithPermission() ; 
}

你擅长onRequestPermissionsResult。。看看结构就知道了。希望它能有所帮助!

最新更新