Runtime permissions
Output:
Output:
activity_main.xml
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/bt_location"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Location permission"
android:textAllCaps="false"/>
<Button
android:id="@+id/bt_contact"
android:layout_below="@+id/bt_location"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Contact permission"
android:textAllCaps="false"/>
</RelativeLayout>
MainActivity.java
MainActivity.java
public class MainActivity extends BaseActivity implements View.OnClickListener {
private Button mBTLocation;
private Button mBTContact;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBTLocation = findViewById(R.id.bt_location);
mBTContact = findViewById(R.id.bt_contact);
mBTLocation.setOnClickListener(this);
mBTContact.setOnClickListener(this);
}
@Override
public void permissionGranted(String permission, int requestCode) {
if (permission.equals(Manifest.permission.ACCESS_FINE_LOCATION) && requestCode == 10)
Toast.makeText(this, "Location permission granted", Toast.LENGTH_SHORT).show();
if (permission.equals(Manifest.permission.READ_CONTACTS) && requestCode == 20)
Toast.makeText(this, "Contact read permission granted", Toast.LENGTH_SHORT).show();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_location:
requestPermission(Manifest.permission.ACCESS_FINE_LOCATION, 10,
"Please accept now location permission",
"You denied permission of location, please accept in permissions settings page");
break;
case R.id.bt_contact:
requestPermission(Manifest.permission.READ_CONTACTS, 20,
"Please accept now contact permission",
"You denied permission of contact, please accept in permissions settings page");
break;
}
}
}
Manifest.xml
Manifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.procon.marshmallowpermissions">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
BaseActivity.java
BaseActivity.java
public abstract class BaseActivity extends AppCompatActivity {
public abstract void permissionGranted(String permission, int requestCode);
public String manualPermissionDesc;
public String permission;
public int requestCode;
//public abstract void onFragmentInteraction(String grantedPermissionDesc);
/**
* Request and check any permission, show explanation dialogue, state granted permissions.
* @param permission run-time permission
* @param description for explanation dialogue.
*/
protected void requestPermission(String permission, int requestCode, String description, String manualPermissionDesc) {
this.manualPermissionDesc = manualPermissionDesc;
this.permission = permission;
this.requestCode = requestCode;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
/* Read contacts*/
if (ContextCompat.checkSelfPermission(this, permission)
!= PackageManager.PERMISSION_GRANTED) {
if( ActivityCompat.shouldShowRequestPermissionRationale(this,
permission)){
showPermissionDialog(permission, description);
}else {
ActivityCompat.requestPermissions( this, new String[]{permission},
requestCode);
}
} else {
permissionGranted(permission, this.requestCode);
}
} else {
permissionGranted(permission, this.requestCode);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull final String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults.length > 0) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
permissionGranted(permissions[0], this.requestCode);
else if (grantResults[0] == PackageManager.PERMISSION_DENIED &&
!ActivityCompat.shouldShowRequestPermissionRationale(this,
permissions[0])) {
showPermissionDialog(null, manualPermissionDesc);
}
}
}
public void showPermissionDialog(final String permission, String description) {
final AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setMessage(description);
dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (permission == null) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", getPackageName(), null));
// Same request code transferred to activity.
startActivityForResult(intent, requestCode);
}else{
ActivityCompat.requestPermissions(BaseActivity.this, new String[]{permission},
requestCode);
}
dialog.dismiss();
}
});
dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
dialog.create().show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (this.requestCode == requestCode) {
if(ContextCompat.checkSelfPermission(this, permission)
== PackageManager.PERMISSION_GRANTED)
permissionGranted(permission, this.requestCode);
}
}
}