android permission权限申请
-1 android sdk 23(6.0)之后api和权限模块进行了升级。
在这部分简单申请权限调用是:
public class PermisionActivity extends AppCompatActivity { private static final int REQUEST_CODE = 200; private static final String TAG = "PermisionActivity"; @RequiresApi(api = Build.VERSION_CODES.M) @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestPermissions(new String[]{ Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_PHONE_STATE },REQUEST_CODE); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { List<String> ps = new ArrayList<>(); switch (requestCode){ case REQUEST_CODE: for(int i = 0;i < permissions.length ;i++){ if(PackageManager.PERMISSION_GRANTED != grantResults[i]){ ps.add(permissions[i]); } } break; } if(ps.size() == 0){ Log.i(TAG, "权限申请全部通过"); }else { Log.i(TAG, "权限未通过的权限名称是: " + Arrays.toString(ps.toArray())); } } }
而源码部分这个requestPermissions(...) api最终会调用
activity.startActivityForResult(....)这个方法
所以最终需在Activity.onRequestPermissionsResult(....) api里处理即可
-2 优化写法
1)因为权限申请必须是依附在activity当前上下文基础上调用Activity内部api requestPermissions()。所以可以第一步我们要创建一个空的透明的activity。
public class EmptyPermissionActivity extends Activity
然后在AndroidMinifest.xml 里配置它的样式theme (style)
AndroidMinifest.xml 里:
<activity android:name=".component.manager.permission.EmptyPermissionActivity" android:screenOrientation="portrait" android:theme="@style/AppThemeNoTitleFullscreen" />
style.xml资源文件里:
<style name="AppThemeNoTitleFullscreen" parent="AppBaseTheme"> <item name="android:windowContentOverlay">@null</item> <!--窗口透明--> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowIsTranslucent">true</item> <!--去掉标题栏--> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> <!--全屏--> <item name="android:windowFullscreen">true</item> </style>
public class EmptyPermissionActivity extends Activity { final int REQUEST_CODE = 0x99; private String requester; private int requestAction; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_permission_empty_help); //申请权限的数组 String[] strings = getIntent().getStringArrayExtra("permissions"); if (strings == null) { strings = AndroidPermissionManager.SIMPLE_PERMISSION_STRINGS; } //请求者 requester = getIntent().getStringExtra("requester"); //其他信息 requestAction = getIntent().getIntExtra("requesterAction",-1); if (StringUtil.isNull(requester)) { finish(); } else { ActivityCompat.requestPermissions(this, strings, REQUEST_CODE); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { //处理回调 AndroidPermissionManager.postWorkToActivity(requester,requestAction, permissions, grantResults); //finish空白的activity finish(); } }
这样一个透明的Activity就已经创建完毕
现在我们还需要一个管理者,来管理“申请人”的请求和回应系统的返回
public final class AndroidPermissionManager{
public static void requestAndroidPermission(String requester, int i, String[] permissions) { if (StringUtil.isNull(requester) || Build.VERSION.SDK_INT < 22) { return; } Intent intent = new Intent("你的Application", EmptyPermissionActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (permissions != null) { intent.putExtra("permissions", permissions); } intent.putExtra("requesterAction", i); intent.putExtra("requester", requester); AppManager.getInstance().getContext().startActivity(intent); }
public static void postWorkToActivity(String requester, int requestAction, String[] permissions, int[] grantResults) { try{ APermissionEntity aPermissionEntity = new APermissionEntity(requester, permissions, grantResults); aPermissionEntity.setRequestAction(requestAction); Log.i(requester, "postWorkToActivity: " + aPermissionEntity);
EventBus.getDefault().post(aPermissionEntity); } catch (Exception ex) { ex.printStackTrace(); } }
}
requestAndroidPermission 用来请求权限。最后有用EventBus来发送回调,在需要的类里写上 onMessage(APermissionEntity e){}即可
不知道evenbus的可以用 register 监听器方式来写回调或者用rxandroid的方式
不过register方式会关注到生命周期的问题
3)完毕~
这只是最简单一种方便的方式请求权限可以在任何时候都可以简单的调用并且及时收到回调。但让前提是你得先在AndroidManifest.xml里先声明。