2016-12-28 142 views
2

我正在处理音乐播放器应用程序所以我必须从存储卡中获取所有歌曲,并且我成功地从存储卡应用程序获取歌曲并在棒棒糖上工作。棉花糖权限错误

问题 棉花糖运行时间允许,我还添加运行时间许可,棉花糖,但是应用程序仍然会崩溃..

这是我的全部代码,请告诉我,我必须写运行时间许可棉花糖。

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:致命异常:主要 过程: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 = 2 8606,uid = 10161需要android.permission.READ_EXTERNAL_STORAGE或者grantUriPermission() at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3319) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415) at android.app.ActivityThread.access $ 1100(ActivityThread.java:229) at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1821) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:7331) at java.lang.reflect.Method.invoke(Native Metho d) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 引起:java。 lang.SecurityException:权限拒绝:从pid = 28606,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) 在机器人。 content.Conte ntProviderProxy.query(ContentProviderNative.java:421) at android.content.ContentResolver.query(ContentResolver.java:502) at android.content.ContentResolver.query(ContentResolver.java:445) at android.app.Activity。 managedQuery(Activity.java:2227) at com.example.j.musicapp.MainActivity.init_phone_music_grid(MainActivity.java:100) at com.example.j.musicapp.MainActivity.onCreate(MainActivity.java:35) at android.app.Activity.performCreate(Activity.java:6904) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136) at android.app.ActivityThread.performLaunchActivity(Acti vityThread.java:3266) at android.app.ActivityThread.handleLaunchActivity(ActivityThread。java:3415) at android.app.ActivityThread.access $ 1100(ActivityThread.java:229) at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1821) at android.os.Handler.dispatchMessage(Handler .java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:7331) at java.lang.reflect.Method.invoke(Native法) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1230) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

+2

发布logcat的细节 –

+0

http://stackoverflow.com/a/34959331/4919210检查这个答案! –

+0

好吧,先生等待............ –

回答

2

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

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); 
+0

thnxx好友.... –

+0

随时好友... –

+0

但是,如果用户拒绝了权限呢? –

0

你可以有这个通用代码结构看是否匹配...我几乎跟着它,效果很好

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

你是好样与onRequestPermissionsResult ..只是看的结构。希望能帮助到你!