Support for Android Marshmallow's permission system
This commit is contained in:
parent
193f716029
commit
6f3617650a
12 changed files with 305 additions and 176 deletions
|
|
@ -1,14 +1,19 @@
|
|||
package com.kabouzeid.gramophone.ui.activities.base;
|
||||
|
||||
import android.Manifest;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.ServiceConnection;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||
import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener;
|
||||
|
|
@ -17,24 +22,53 @@ import com.kabouzeid.gramophone.service.MusicService;
|
|||
import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import hugo.weaving.DebugLog;
|
||||
|
||||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements ServiceConnection, MusicServiceEventListener {
|
||||
public static final String TAG = AbsMusicServiceActivity.class.getSimpleName();
|
||||
|
||||
public static final int REQUEST_EXTERNAL_STORAGE_PERMISSION = 0;
|
||||
|
||||
private final ArrayList<MusicServiceEventListener> mMusicServiceEventListener = new ArrayList<>();
|
||||
|
||||
private MusicPlayerRemote.ServiceToken serviceToken;
|
||||
private MusicStateReceiver musicStateReceiver;
|
||||
private boolean receiverRegistered;
|
||||
|
||||
private boolean hasExternalStoragePermission;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
checkExternalStoragePermissions();
|
||||
serviceToken = MusicPlayerRemote.bindToService(this, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
// the handler is necessary to avoid "java.lang.RuntimeException: Performing pause of activity that is not resumed"
|
||||
new Handler().postDelayed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
recreateIfPermissionsChanged();
|
||||
}
|
||||
}, 200);
|
||||
}
|
||||
|
||||
protected void recreateIfPermissionsChanged() {
|
||||
if (didPermissionsChanged()) {
|
||||
recreate();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean didPermissionsChanged() {
|
||||
return hasExternalStoragePermission != hasExternalStoragePermission();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceConnected(ComponentName name, IBinder service) {
|
||||
if (!receiverRegistered) {
|
||||
|
|
@ -161,4 +195,30 @@ public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void checkExternalStoragePermissions() {
|
||||
hasExternalStoragePermission = hasExternalStoragePermission();
|
||||
if (hasExternalStoragePermission) {
|
||||
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_EXTERNAL_STORAGE_PERMISSION);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean hasExternalStoragePermission() {
|
||||
return Build.VERSION.SDK_INT < Build.VERSION_CODES.M || checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED;
|
||||
}
|
||||
|
||||
@DebugLog
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
if (requestCode == REQUEST_EXTERNAL_STORAGE_PERMISSION) {
|
||||
for (int grantResult : grantResults) {
|
||||
if (grantResult == PackageManager.PERMISSION_GRANTED) {
|
||||
recreate();
|
||||
return;
|
||||
}
|
||||
}
|
||||
Toast.makeText(AbsMusicServiceActivity.this, "You must grant permission to external storage in order to explore your music", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue