<?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>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 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>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); } }}