gpt4 book ai didi

android - 棉花糖权限错误

转载 作者:行者123 更新时间:2023-11-29 00:03:51 26 4
gpt4 key购买 nike

我正在研究Music Player应用程序,因此我必须从存储卡中获取所有歌曲,然后从存储卡应用程序中成功获取歌曲,并在Lollipop上正常工作。

问题
棉花糖运行时权限我也为棉花糖添加了运行时权限,但应用仍然崩溃..

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

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:28606
                                                                        java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.j.musicapp / com.example.j.musicapp.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(ActivityThread.java:3319)
                                                                            在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415)
                                                                            在android.app.ActivityThread.access $ 1100(ActivityThread.java:229)
                                                                            在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1821)
                                                                            在android.os.Handler.dispatchMessage(Handler.java:102)
                                                                            在android.os.Looper.loop(Looper.java:148)
                                                                            在android.app.ActivityThread.main(ActivityThread.java:7331)
                                                                            在java.lang.reflect.Method.invoke(本机方法)
                                                                            在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                            在com.android.internal.os.ZygoteInit.main(ZygoteInit.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.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
                                                                            在android.database.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(ActivityThread.java:3266)
                                                                            在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415)
                                                                            在android.app.ActivityThread.access $ 1100(ActivityThread.java:229)
                                                                            在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1821)
                                                                            在android.os.Handler.dispatchMessage(Handler.java:102)
                                                                            在android.os.Looper.loop(Looper.java:148)
                                                                            在android.app.ActivityThread.main(ActivityThread.java:7331)
                                                                            在java.lang.reflect.Method.invoke(本机方法)
                                                                            在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                            在com.android.internal.os.ZygoteInit.main(ZygoteInit.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);

关于android - 棉花糖权限错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41359898/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com