做安卓其实挺费劲的,各种机型都够操心了,动态权限又恶心了一下
but 项目中针对6.0以上手机,还是必要处理一下权限申请的问题!!
首先,判断是否6.0以上,判断是否申请权限,拒绝了的权限怎么办?(android机型比较多,三星手机弹出申请弹框拒绝了,第二次还是会弹出权限申请框;但是我用的小米4,拒绝了第二次就默认拒绝了不会弹框;还有一些手机低版本的会一直弹框)
权限工具类:
import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v4.content.PermissionChecker; import com.motian.permissionrequest.ToastUtils; import java.util.ArrayList; import java.util.List; import static android.R.attr.targetSdkVersion; /** * ClassName:ParameterFactory * Description TODO 动态权限处理 * 参考:http://blog.csdn.net/u011200604/article/details/52874599 * created by BAI * Data 2016/12/20 */ public class PermissionUtils { private static final int PERMISSION_REQUEST_CODE = 100; /** * 请求权限 * @param mActivity * @param permissions */ public void requestRunPermission(Activity mActivity, String[] permissions, PermissionListener mListener){ ListpermissionLists = new ArrayList<>(); for(String permission : permissions){ if( selfPermissionGranted(mActivity,permission)){ permissionLists.add(permission); } } if(!permissionLists.isEmpty()){ ActivityCompat.requestPermissions(mActivity, permissionLists.toArray(new String[permissionLists.size()]), PERMISSION_REQUEST_CODE); }else{ //表示全都授权了 mListener.onGranted(); } } /** * 判断权限是否已授权 * @param permission * @return */ public boolean selfPermissionGranted(Activity mContext,String permission) { // For Android < Android M, self permissions are always granted. boolean result = true; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (targetSdkVersion >= Build.VERSION_CODES.M) { // targetSdkVersion >= Android M, we can // use Context#checkSelfPermission result = ContextCompat.checkSelfPermission(mContext, permission) != PackageManager.PERMISSION_GRANTED; } else { // targetSdkVersion < Android M, we have to use PermissionChecker result = PermissionChecker.checkSelfPermission(mContext, permission) == PermissionChecker.PERMISSION_GRANTED; } } return result; } /** * 请求权限结果,baseActivity调用 * @param requestCode * @param permissions * @param grantResults * @param mListener */ public void requestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults,PermissionListener mListener) { switch (requestCode){ case PERMISSION_REQUEST_CODE: if(grantResults.length > 0){ //存放没授权的权限 List deniedPermissions = new ArrayList<>(); for(int i = 0; i < grantResults.length; i++){ int grantResult = grantResults[i]; String permission = permissions[i]; if(grantResult != PackageManager.PERMISSION_GRANTED){ deniedPermissions.add(permission); } } if(deniedPermissions.isEmpty()){ //说明都授权了 mListener.onGranted(); }else{ mListener.onDenied(deniedPermissions); } } break; default: break; } } /** * 打开设置权限页面 * @param activity * @param message */ public static void openSettingActivity(final Activity activity, String message) { showMessageOKCancel(activity, message, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", activity.getPackageName(), null); intent.setData(uri); activity.startActivity(intent); } }, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int which) { ToastUtils.showToast(activity,"请设置必要的权限!"); } }); } /** * 显示弹框 * @param context * @param message * @param settingListener * @param cancelListener */ private static void showMessageOKCancel(final Activity context, String message, DialogInterface.OnClickListener settingListener, DialogInterface.OnClickListener cancelListener) { String permissionMessage = "当前应用缺少必要权限("+message+")\n" + "\n 请点击“设置”-“权限”-打开所需权限。\n"+"" + "\n 最后点击两次后退按钮,即可返回"; new AlertDialog.Builder(context) .setTitle("提示") .setMessage(permissionMessage) .setPositiveButton("设置", settingListener) .setNegativeButton("取消", cancelListener) .create() .show(); } }
权限申请依附于Activity,BaseAcivity和BaseFragment调用:
/** * ClassName: BaseActivity * Description: 基础信息 * author 漠天 * date 2017/6/11 */ public abstract class BaseActivity extends AppCompatActivity{ protected Activity mContext = this; /** * 权限监听 */ private PermissionListener mListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } /** * 请求权限(在onResume中写会重复调用弹窗,知道允许权限) * @param mActivity * @param permissions */ public void requestRunPermission(Activity mActivity, String[] permissions, PermissionListener mListener){ this.mListener = mListener; new PermissionUtils().requestRunPermission(mActivity,permissions,mListener); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); new PermissionUtils().requestPermissionsResult(requestCode, permissions, grantResults,mListener); } }
/** * ClassName:BaseFragment * Description BaseFragment * created by BAI * Data 2017/6/11 */ public abstract class BaseFragment extends Fragment{ /** * Activity mContext */ protected Activity mContext; @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mContext = getActivity(); return null; } /** * 请求权限 * @param mActivity * @param permissions */ public void requestRunPermission(Activity mActivity, String[] permissions, PermissionListener mListener){ ((BaseActivity)mActivity).requestRunPermission(mActivity,permissions,mListener); } }
然后,MainActivity调用申请:
public class MainActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = (Button)findViewById(R.id.request); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { permission(); } }); Button openPermissionActivity = (Button)findViewById(R.id.openPermissionActivity); openPermissionActivity.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", mContext.getPackageName(), null); intent.setData(uri); mContext.startActivity(intent); } }); permission(); } /** * 判断权限 */ private void permission(){ requestRunPermission(mContext,new String[]{Manifest.permission.CAMERA, Manifest.permission.CALL_PHONE,Manifest.permission.READ_EXTERNAL_STORAGE},new PermissionListener() { @Override public void onGranted() { //表示所有权限都授权了 ToastUtils.showToast(mContext,"已经全部接受,可以处理其他事儿了^_^"); } @Override public void onDenied(ListdeniedPermission) { PermissionUtils.openSettingActivity(mContext,ToastUtils.getPermissionText(mContext,deniedPermission)); } }); } }
效果图:
demo代码结构:
demo PermissionRequest