2016-07-15 6 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

Вы можете использовать этот андроид 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); 

Gradle

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 любым разрешением, которое вы хотите попросить.

Смежные вопросы