2016-07-15 108 views
3

我在我的音乐播放器上制作了一个Android应用程序,其中我使用listview在我的设备中填充了所有歌曲,但是在Android 6.0中,我的应用程序崩溃,因为我打开它。它不会在我给它存储时崩溃在应用程序信息中手动设置权限,然后显示我的歌曲。 我已经使用了android 6.0的请求权限,并且它导致要求用户询问存储的访问权限,但之后它不再显示列表。我被困在这个...!我想要在应用运行时android Marshmallow请求权限..!

MainActivity.java

public class MainActivity extends AppCompatActivity implements MediaPlayerControl { 
    private ArrayList<Song> songList; 
    private ListView songView; 
    private MusicController controller; 
    private MusicService musicSrv; 
    private Intent playIntent; 
    private boolean musicBound=false; 
    private boolean paused=false, playbackPaused=false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     songView = (ListView) findViewById(R.id.song_list); 
     songList = new ArrayList<Song>(); 

    //Android 6.0 
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) 
      != PackageManager.PERMISSION_GRANTED) { 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.READ_EXTERNAL_STORAGE)) { 


     } else { 

     } 
    } else { 
     ActivityCompat.requestPermissions(this, 
       new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1002); 
    } 
} 
//Android 6.0 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    switch (requestCode){ 
     case 1002: 
      if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){ 
       getSongList(); 
       // List songs in Alphabetical Order 
       Collections.sort(songList, new Comparator<Song>() { 
        public int compare(Song a, Song b) { 
         return a.getTitle().compareTo(b.getTitle()); 
        } 
       }); 

       SongAdapter songAdt = new SongAdapter(this, songList); 
       songView.setAdapter(songAdt); 
       setController(); 
      }else{ 

      } 
      return; 
    } 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.action_shuffle: 
      musicSrv.setShuffle(); 
      break; 
     case R.id.action_end: 
      stopService(playIntent); 
      musicSrv = null; 
      System.exit(0); 
      break; 
    } 
    return super.onOptionsItemSelected(item); 
} 
@Override 
protected void onStart() { 
    super.onStart(); 
    if(playIntent==null) { 
     playIntent = new Intent(this, MusicService.class); 
     bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE); 
     startService(playIntent); 
    } 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    paused=true; 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    if(paused){ 
     setController(); 
     paused=false; 
    } 
} 
@Override 
protected void onStop() { 
    controller.hide(); 
    super.onStop(); 
} 
@Override 
protected void onDestroy() { 
    stopService(playIntent); 
    musicSrv=null; 
    super.onDestroy(); 
} 
public void songPicked(View view){ 
    musicSrv.setSong(Integer.parseInt(view.getTag().toString())); 
    musicSrv.playSong(); 
    if(playbackPaused){ 
     setController(); 
     playbackPaused=false; 
    }controller.show(0); 
} 

//connect to the service 
private ServiceConnection musicConnection = new ServiceConnection(){ 

    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     MusicService.MusicBinder binder = (MusicService.MusicBinder)service; 
     //get service 
     musicSrv = binder.getService(); 
     //pass list 
     musicSrv.setList(songList); 
     musicBound = true; 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName name) { 
     musicBound = false; 
    } 
}; 

public void getSongList() { 
    //retrieve song info 
    ContentResolver musicResolver = getContentResolver(); 
    Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
    Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null); 

    if(musicCursor!=null && musicCursor.moveToFirst()){ 
     //get columns 
     int titleColumn = musicCursor.getColumnIndex 
       (android.provider.MediaStore.Audio.Media.TITLE); 
     int idColumn = musicCursor.getColumnIndex 
       (android.provider.MediaStore.Audio.Media._ID); 
     int artistColumn = musicCursor.getColumnIndex 
       (android.provider.MediaStore.Audio.Media.ARTIST); 
     //add songs to list 
     do { 
      long thisId = musicCursor.getLong(idColumn); 
      String thisTitle = musicCursor.getString(titleColumn); 
      String thisArtist = musicCursor.getString(artistColumn); 
      songList.add(new Song(thisId, thisTitle, thisArtist)); 
     } 
     while (musicCursor.moveToNext()); 
    } 
} 
+1

检查这里的解决方案http://stackoverflow.com/a/37160573/842607 –

+0

在这里检查http://stackoverflow.com/a/38305951/5324829 – gaurang

+0

检查这一个:http://stackoverflow.com/问题/ 37253397/android-permisson-request-code-issue/37253779#37253779 – Vickyexpert

回答

2

您可以使用,使处理运行权限轻松许多这个Android library

如果你的活动子类PermisoActivity,请求权限是一样简单:

Permiso.getInstance().requestPermissions(new Permiso.IOnPermissionResult() { 
    @Override 
    public void onPermissionResult(Permiso.ResultSet resultSet) { 
     if (resultSet.areAllPermissionsGranted()) { 
      // Permission granted! 
     } else { 
      // Permission denied. 
     } 
    } 

    @Override 
    public void onRationaleRequested(Permiso.IOnRationaleProvided callback, String... permissions) { 
     Permiso.getInstance().showRationaleInDialog("Title", "Message", null, callback); 
    } 
}, Manifest.permission.READ_EXTERNAL_STORAGE); 

摇篮

dependencies { 
    compile 'com.greysonparrelli.permiso:permiso:0.2.0' 
} 

您可以添加多个权限,还请访问link共享。您可以详细了解所有信息。

2

此代码将允许您在运行时请求权限,方法是检查权限是否已被授予,如果没有,请求用户启用权限。

if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, MY_PERMISSION_RESPONSE); 
     } 

在这种情况下被检查的权限是与位置服务有关。只需将ACCESS_COARSE_LOCATION替换为您希望要求的任何许可。