I am trying to revoke permissions of my app in my SplashScreen but its been crashing everytime. I have slo put check in my onCreate to check if the sdk version is >= 23.
SplashScreen.java
public class SplashScreen extends Activity {
// Splash screen timer
public static final String MyPREFERENCES = "MyPrefs";
SharedPreferences sharedpreferences;
MediaPlayer ringtone;
Context context;
private static int SPLASH_TIME_OUT = 500;
private Activity activity;
private static final int PERMISSION_REQUEST_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash_screen);
context = getApplicationContext();
activity = this;
ConnectionDetector cd = new ConnectionDetector(getApplicationContext());
Boolean isInternetPresent = cd.isConnectingToInternet();
System.out.println(isInternetPresent);
if(isInternetPresent){
new Handler().postDelayed(new Runnable() {
/*
* Showing splash screen with a timer. This will be useful when you
* want to show case your app logo / company
*/
public void run() {
// This method will be executed once the timer is over
// Start your app main activity
Intent i = new Intent(SplashScreen.this, MainActivity.class);
startActivity(i);
// close this activity
finish();
}
}, SPLASH_TIME_OUT);
boolean granted=checkPermission();
Log.d("Permission already there","---"+granted );
/*if(!granted){
requestPermission();
}*/
if (Build.VERSION.SDK_INT >= 23) {
System.out.println("Build version is"+Build.VERSION.SDK_INT);
requestPermission();
}
}
else{
Toast.makeText(getApplicationContext(), "Not Connected to internet",Toast.LENGTH_SHORT).show();
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("No Internet Connection Available. Do you want to try again")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
// if this button is clicked, close
// current activity
Boolean status = NetworkUtil.getConnectivityStatusString(getApplicationContext());
if(status){
Intent i = new Intent(getApplicationContext(), SplashScreen.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
else{
// create alert dialog
AlertDialog alertDialog = builder.create();
// show it
alertDialog.show();
}
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// Action for 'NO' Button
finish();
}
});
//Creating dialog box
AlertDialog alert = builder.create();
//Setting the title manually
alert.setTitle("No Internet");
alert.show();
}
}
private boolean checkPermission(){
int result = ContextCompat.checkSelfPermission(SplashScreen.this, Manifest.permission.ACCESS_FINE_LOCATION)+
ContextCompat.checkSelfPermission(SplashScreen.this, Manifest.permission.MODIFY_AUDIO_SETTINGS)+
ContextCompat.checkSelfPermission(SplashScreen.this, Manifest.permission.RECORD_AUDIO)+
ContextCompat.checkSelfPermission(SplashScreen.this, Manifest.permission.CAPTURE_AUDIO_OUTPUT)+
ContextCompat.checkSelfPermission(SplashScreen.this, Manifest.permission.DISABLE_KEYGUARD)+
ContextCompat.checkSelfPermission(SplashScreen.this, Manifest.permission.WAKE_LOCK)+
ContextCompat.checkSelfPermission(SplashScreen.this, Manifest.permission.CAPTURE_VIDEO_OUTPUT)+
ContextCompat.checkSelfPermission(SplashScreen.this, Manifest.permission.CALL_PHONE)+
ContextCompat.checkSelfPermission(SplashScreen.this, Manifest.permission.CAMERA)+
ContextCompat.checkSelfPermission(SplashScreen.this, Manifest.permission.CAPTURE_SECURE_VIDEO_OUTPUT)+
ContextCompat.checkSelfPermission(SplashScreen.this, Manifest.permission.ACCESS_NETWORK_STATE)+
ContextCompat.checkSelfPermission(SplashScreen.this, Manifest.permission.VIBRATE)+
ContextCompat.checkSelfPermission(SplashScreen.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)+
ContextCompat.checkSelfPermission(SplashScreen.this, Manifest.permission.GET_ACCOUNTS)+
ContextCompat.checkSelfPermission(SplashScreen.this, Manifest.permission.READ_CONTACTS)
;
if (result == PackageManager.PERMISSION_GRANTED){
System.out.println("Returning true");
return true;
} else {
System.out.println("Returning false");
return false;
}
}
private void requestPermission(){
Log.d("requestPermission ","Inside requestPermission");
Log.d("activity ",activity+"");
Log.d("activity ",Manifest.permission.ACCESS_FINE_LOCATION+"");
if (ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.ACCESS_FINE_LOCATION)&&
ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.MODIFY_AUDIO_SETTINGS)&&
ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.RECORD_AUDIO)&&
ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.CAPTURE_AUDIO_OUTPUT)&&
ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.DISABLE_KEYGUARD)&&
ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.WAKE_LOCK)&&
ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.CAPTURE_VIDEO_OUTPUT)&&
ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.CALL_PHONE)&&
ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.CAMERA)&&
ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.CAPTURE_SECURE_VIDEO_OUTPUT)&&
ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.ACCESS_NETWORK_STATE)&&
ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.WRITE_EXTERNAL_STORAGE)&&
ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.READ_CONTACTS)&&
ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.GET_ACCOUNTS)&&
ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.VIBRATE)){
Log.d("requestPermission","Inside if requestPermission");
} else {
Log.d("requestPermission","Inside else of requestPermission");
ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.MODIFY_AUDIO_SETTINGS,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.CAPTURE_AUDIO_OUTPUT,
Manifest.permission.DISABLE_KEYGUARD,
Manifest.permission.WAKE_LOCK,
Manifest.permission.CAPTURE_VIDEO_OUTPUT,
Manifest.permission.CALL_PHONE,
Manifest.permission.CAMERA,
Manifest.permission.CAPTURE_SECURE_VIDEO_OUTPUT,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_CONTACTS,
Manifest.permission.GET_ACCOUNTS,
Manifest.permission.VIBRATE,
},PERMISSION_REQUEST_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_CODE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Snackbar.make(view,"Permission Granted, Now you can access location data.",Snackbar.LENGTH_LONG).show();
Toast.makeText(context, "Permission Granted, Now you can access location data.", Toast.LENGTH_LONG).show();
} else {
// Snackbar.make(view,"Permission Denied, You cannot access location data.",Snackbar.LENGTH_LONG).show();
Toast.makeText(context, "Permission Denied, You cannot access location data.", Toast.LENGTH_LONG).show();
}
break;
}
}
}
In my logs what I can see its printing activity variable and some other variables too. I am not understanding which variable is getting null. logs.txt
10-19 15:25:40.282: I/System.out(15747): Returning false
10-19 15:25:40.282: D/Permission already there(15747): ---false
10-19 15:25:40.282: D/requestPermission(15747): Inside requestPermission
10-19 15:25:40.282: D/AndroidRuntime(15747): Shutting down VM
10-19 15:25:40.293: E/AndroidRuntime(15747): FATAL EXCEPTION: main
10-19 15:25:40.293: E/AndroidRuntime(15747): Process: com.example, PID: 15747
10-19 15:25:40.293: E/AndroidRuntime(15747): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.app.Activity.shouldShowRequestPermissionRationale(java.lang.String)' on a null object reference
10-19 15:25:40.293: E/AndroidRuntime(15747): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426)
10-19 15:25:40.293: E/AndroidRuntime(15747): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)
10-19 15:25:40.293: E/AndroidRuntime(15747): at android.app.ActivityThread.-wrap11(ActivityThread.java)
10-19 15:25:40.293: E/AndroidRuntime(15747): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)
10-19 15:25:40.293: E/AndroidRuntime(15747): at android.os.Handler.dispatchMessage(Handler.java:102)
10-19 15:25:40.293: E/AndroidRuntime(15747): at android.os.Looper.loop(Looper.java:148)
10-19 15:25:40.293: E/AndroidRuntime(15747): at android.app.ActivityThread.main(ActivityThread.java:5443)
10-19 15:25:40.293: E/AndroidRuntime(15747): at java.lang.reflect.Method.invoke(Native Method)
10-19 15:25:40.293: E/AndroidRuntime(15747): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
10-19 15:25:40.293: E/AndroidRuntime(15747): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
10-19 15:25:40.293: E/AndroidRuntime(15747): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.app.Activity.shouldShowRequestPermissionRationale(java.lang.String)' on a null object reference
10-19 15:25:40.293: E/AndroidRuntime(15747): at android.support.v4.app.ActivityCompatApi23.shouldShowRequestPermissionRationale(ActivityCompat23.java:37)
10-19 15:25:40.293: E/AndroidRuntime(15747): at android.support.v4.app.ActivityCompat.shouldShowRequestPermissionRationale(ActivityCompat.java:363)
10-19 15:25:40.293: E/AndroidRuntime(15747): at com.example.MainActivity.requestPermission(MainActivity.java:140)
Try to not request permissions at the SplashActivity
start. Request it when MainActivity
is already started. I think your problem could be that you finish SplashActivity
before the app will execute all the code relevant to permissions (as you are starting the next activity in the delayed handler).