public class AppSettingsDialogFragment extends DialogFragment {
public static final String TAG = "AppSettingsDialogFragment";
public static final int DEFAULT_SETTINGS_REQ_CODE = 16061;
private static final String ARG_POSITIVE_BUTTON = "positiveButton";
private static final String ARG_NEGATIVE_BUTTON = "negativeButton";
private static final String ARG_RATIONALE_TITLE = "rationaleTitle";
private static final String ARG_RATIONALE_MESSAGE = "rationaleMsg";
private static final String ARG_REQUEST_CODE = "requestCode";
private int positiveButton;
private int negativeButton;
private String rationaleTitle;
private String rationaleMsg;
private int requestCode;
public AppSettingsDialogFragment() {
}
public static AppSettingsDialogFragment newInstance(
@StringRes int positiveButton, @StringRes int negativeButton,
@NonNull String rationaleTitle, @NonNull String rationaleMsg,
int requestCode) {
AppSettingsDialogFragment fragment = new AppSettingsDialogFragment();
Bundle args = new Bundle();
args.putInt(ARG_POSITIVE_BUTTON, positiveButton);
args.putInt(ARG_NEGATIVE_BUTTON, negativeButton);
args.putString(ARG_RATIONALE_TITLE, rationaleTitle);
args.putString(ARG_RATIONALE_MESSAGE, rationaleMsg);
args.putInt(ARG_REQUEST_CODE, requestCode);
fragment.setArguments(args);
return fragment;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
if (getArguments() != null) {
positiveButton = getArguments().getInt(ARG_POSITIVE_BUTTON);
negativeButton = getArguments().getInt(ARG_NEGATIVE_BUTTON);
rationaleTitle = getArguments().getString(ARG_RATIONALE_TITLE);
rationaleMsg = getArguments().getString(ARG_RATIONALE_MESSAGE);
requestCode = getArguments().getInt(ARG_REQUEST_CODE);
}
setCancelable(false);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setCancelable(false)
.setTitle(rationaleTitle)
.setMessage(rationaleMsg)
.setPositiveButton(positiveButton, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (getContext() instanceof Activity) {
Activity activity = (Activity) getContext();
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
intent.setData(uri);
activity.startActivityForResult(intent, requestCode);
}
}
})
.setNegativeButton(negativeButton, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
return builder.create();
}
}
public class MainActivity extends AppCompatActivity implements RationaleDialogFragment.PermissionCallbacks {
public static final String TAG = "MainActivity";
private static final int RC_CAMERA = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
Log.i(TAG, "onRequestPermissionsResult:" + requestCode + "," + Arrays.toString(permissions) + "," + Arrays.toString(grantResults));
switch (requestCode) {
case RC_CAMERA: {
// 如果请求被取消了,那么结果数组就是空的
if (grantResults.length > 0) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限被授予了
showCameraPreview();
} else {
// 权限被拒绝了
if (!ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)) {
// 向用户显示一个对话框引导用户跳转到"设置>应用>[你的应用]"页面
// 让用户手动授予该权限
AppSettingsDialogFragment
.newInstance(android.R.string.ok, android.R.string.cancel,
getString(R.string.permissions_required),
getString(R.string.rationale_ask_again),
AppSettingsDialogFragment.DEFAULT_SETTINGS_REQ_CODE)
.show(getSupportFragmentManager(), AppSettingsDialogFragment.TAG);
}
}
}
return;
}
}
}
public void showCamera(View view) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
// 我们应该给用户个解释?
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)) {
// 向用户显示一个解释,要以异步非阻塞的方式
// 该线程将等待用户响应!等用户看完解释后再继续尝试请求权限
RationaleDialogFragment
.newInstance(android.R.string.ok, android.R.string.cancel,
getString(R.string.rationale_camera), RC_CAMERA,
new String[]{Manifest.permission.CAMERA})
.show(getSupportFragmentManager(), RationaleDialogFragment.TAG);
} else {
// 不需要向用户解释了,我们可以直接请求该权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},
RC_CAMERA);
}
} else {
showCameraPreview();
}
}
private void showCameraPreview() {
getSupportFragmentManager().beginTransaction()
.replace(R.id.content_fragment, CameraPreviewFragment.newInstance())
.addToBackStack("camera")
.commit();
}
@Override
public void onPermissionsGranted(int requestCode, List<String> perms) {
Log.i(TAG, "onPermissionsGranted:" + requestCode + ":" + perms.size());
}
@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
Log.i(TAG, "onPermissionsDenied:" + requestCode + ":" + perms.size());
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == AppSettingsDialogFragment.DEFAULT_SETTINGS_REQ_CODE) {
Log.i(TAG, "onActivityResult:" + requestCode + ":" + data);
}
}
}