Android中实现动态获取权限
- 添加第三方框架
implementation "com.github.permissions-dispatcher:permissionsdispatcher:4.9.2"
annotationProcessor "com.github.permissions-dispatcher:permissionsdispatcher-processor:4.9.2"
- 使用,我是用在第一次运行app的时候,导航界面处调用,参考如下代码:
package com.ixuea.courses.mymusic.component.splash.activity;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import com.ixuea.courses.mymusic.MainActivity;
import com.ixuea.courses.mymusic.R;
import com.ixuea.courses.mymusic.activity.BaseViewModelActivity;
import com.ixuea.courses.mymusic.component.ad.activity.AdActivity;
import com.ixuea.courses.mymusic.component.guide.activity.GuidActivity;
import com.ixuea.courses.mymusic.component.splash.fragment.TermServiceDialogFragment;
import com.ixuea.courses.mymusic.config.Config;
import com.ixuea.courses.mymusic.databinding.ActivitySplashBinding;
import com.ixuea.courses.mymusic.util.DefaultPreferenceUtil;
import com.ixuea.courses.mymusic.util.IntentUtil;
import com.ixuea.courses.mymusic.util.PreferenceUtil;
import com.ixuea.courses.mymusic.util.SuperDarkUtil;
import com.ixuea.courses.mymusic.util.SuperDateUtil;
import com.qmuiteam.qmui.util.QMUIStatusBarHelper;
import permissions.dispatcher.NeedsPermission;
import permissions.dispatcher.OnNeverAskAgain;
import permissions.dispatcher.OnPermissionDenied;
import permissions.dispatcher.OnShowRationale;
import permissions.dispatcher.PermissionRequest;
import permissions.dispatcher.RuntimePermissions;
@RuntimePermissions
public class SplashActivity extends BaseViewModelActivity<ActivitySplashBinding> {
@Override
protected void initViews() {
super.initViews();
QMUIStatusBarHelper.translucent(this);
if (SuperDarkUtil.isDark(this)) {
QMUIStatusBarHelper.setStatusBarDarkMode(this);
} else {
QMUIStatusBarHelper.setStatusBarDarkMode(this);
}
}
@Override
protected void initDatum() {
super.initDatum();
int year = SuperDateUtil.currentYear();
binding.copyright.setText(getResources().getString(R.string.copyright, year));
if (DefaultPreferenceUtil.getInstance(getHostActivity()).isAcceptTermsServiceAgreement()) {
checkPermission();
} else {
showTermsServiceAgreementDialog();
}
}
private void showTermsServiceAgreementDialog() {
TermServiceDialogFragment.show(getSupportFragmentManager(), new View.OnClickListener() {
@Override
public void onClick(View v) {
DefaultPreferenceUtil.getInstance(getHostActivity()).setAcceptTermsServiceAgreement();
checkPermission();
}
});
}
private void preareNext() {
if (sp.isShowGuide()) {
next();
}
postNext();
}
private void postNext() {
binding.copyright.postDelayed(new Runnable() {
@Override
public void run() {
next();
}
}, Config.SPLASH_DEFAULT_DELAY_TIME);
}
private void next() {
Intent intent = new Intent();
Intent oldIntent = getIntent();
IntentUtil.cloneIntent(oldIntent, intent);
intent.setClass(getHostActivity(), AdActivity.class);
startActivity(intent);
finish();
overridePendingTransition(0, 0);
}
private void checkPermission() {
SplashActivityPermissionsDispatcher.onPermissionGrantedWithPermissionCheck(this);
}
@NeedsPermission({
Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.POST_NOTIFICATIONS,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
})
void onPermissionGranted() {
preareNext();
}
@OnShowRationale({
Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.POST_NOTIFICATIONS,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
})
void showRequestPermission(PermissionRequest request) {
new AlertDialog.Builder(getHostActivity())
.setMessage(R.string.permission_hint)
.setPositiveButton(R.string.allow, (dialog, which) -> request.proceed())
.setNegativeButton(R.string.deny, (dialog, which) -> request.cancel()).show();
}
@OnPermissionDenied({
Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.POST_NOTIFICATIONS,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
})
void showDenied() {
finish();
}
@OnNeverAskAgain({
Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.POST_NOTIFICATIONS,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
})
void showNeverAsk() {
checkPermission();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
SplashActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}
}
- 注意在AndroidManifest中添加权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />