PermissionManage
介紹
如果設備運行的是 Android 6.0(API 級別 23)或更高版本,並且應用的 targetSdkVersion 是 23 或更高版本,則應用在運行時向用戶請求權限。
如果設備運行的是 Android 5.1(API 級別 22)或更低版本,並且應用的 targetSdkVersion 是 22 或更低版本,則系統會在用戶安裝應用時要求用戶授予權限。
參考資料
https://developer.android.google.cn/guide/topics/security/permissions.html
https://github.com/lovedise/PermissionGen
https://github.com/tbruyelle/RxPermissions
以下是需要單獨申請的權限,共分為9組,每組只要有一個權限申請成功了,就默認整組權限都可以使用了
XML/HTML代碼
- group:android.permission-group.CONTACTS
- permission:android.permission.WRITE_CONTACTS
- permission:android.permission.GET_ACCOUNTS
- permission:android.permission.READ_CONTACTS
-
- group:android.permission-group.PHONE
- permission:android.permission.READ_CALL_LOG
- permission:android.permission.READ_PHONE_STATE
- permission:android.permission.CALL_PHONE
- permission:android.permission.WRITE_CALL_LOG
- permission:android.permission.USE_SIP
- permission:android.permission.PROCESS_OUTGOING_CALLS
- permission:com.android.voicemail.permission.ADD_VOICEMAIL
-
- group:android.permission-group.CALENDAR
- permission:android.permission.READ_CALENDAR
- permission:android.permission.WRITE_CALENDAR
-
- group:android.permission-group.CAMERA
- permission:android.permission.CAMERA
-
- group:android.permission-group.SENSORS
- permission:android.permission.BODY_SENSORS
-
- group:android.permission-group.LOCATION
- permission:android.permission.ACCESS_FINE_LOCATION
- permission:android.permission.ACCESS_COARSE_LOCATION
-
- group:android.permission-group.STORAGE
- permission:android.permission.READ_EXTERNAL_STORAGE
- permission:android.permission.WRITE_EXTERNAL_STORAGE
-
- group:android.permission-group.MICROPHONE
- permission:android.permission.RECORD_AUDIO
-
- group:android.permission-group.SMS
- permission:android.permission.READ_SMS
- permission:android.permission.RECEIVE_WAP_PUSH
- permission:android.permission.RECEIVE_MMS
- permission:android.permission.RECEIVE_SMS
- permission:android.permission.SEND_SMS
- permission:android.permission.READ_CELL_BROADCASTS
以下是普通權限,只需要在AndroidManifest.xml中申請即可
XML/HTML代碼
- android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
- android.permission.ACCESS_NETWORK_STATE
- android.permission.ACCESS_NOTIFICATION_POLICY
- android.permission.ACCESS_WIFI_STATE
- android.permission.ACCESS_WIMAX_STATE
- android.permission.BLUETOOTH
- android.permission.BLUETOOTH_ADMIN
- android.permission.BROADCAST_STICKY
- android.permission.CHANGE_NETWORK_STATE
- android.permission.CHANGE_WIFI_MULTICAST_STATE
- android.permission.CHANGE_WIFI_STATE
- android.permission.CHANGE_WIMAX_STATE
- android.permission.DISABLE_KEYGUARD
- android.permission.EXPAND_STATUS_BAR
- android.permission.FLASHLIGHT
- android.permission.GET_ACCOUNTS
- android.permission.GET_PACKAGE_SIZE
- android.permission.INTERNET
- android.permission.KILL_BACKGROUND_PROCESSES
- android.permission.MODIFY_AUDIO_SETTINGS
- android.permission.NFC
- android.permission.READ_SYNC_SETTINGS
- android.permission.READ_SYNC_STATS
- android.permission.RECEIVE_BOOT_COMPLETED
- android.permission.REORDER_TASKS
- android.permission.REQUEST_INSTALL_PACKAGES
- android.permission.SET_TIME_ZONE
- android.permission.SET_WALLPAPER
- android.permission.SET_WALLPAPER_HINTS
- android.permission.SUBSCRIBED_FEEDS_READ
- android.permission.TRANSMIT_IR
- android.permission.USE_FINGERPRINT
- android.permission.VIBRATE
- android.permission.WAKE_LOCK
- android.permission.WRITE_SYNC_SETTINGS
- com.android.alarm.permission.SET_ALARM
- com.android.launcher.permission.INSTALL_SHORTCUT
- com.android.launcher.permission.UNINSTALL_SHORTCUT
示例代碼
Java代碼
- /**
- * BaseActivity
- *
- * @author Edwin.Wu
- * @version 2017/3/17$ 14:12$
- * @since JDK1.8
- */
- public class BaseActivity extends AppCompatActivity {
-
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- }
-
- /**
- * 為子類提供一個權限檢查方法
- *
- * @param permissions
- * @return
- */
- public boolean hasPermission(String... permissions) {
- for (String permission : permissions) {
- if (ActivityCompat.checkSelfPermission(this, permission)
- != PackageManager.PERMISSION_GRANTED) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * 權限請求申請
- *
- * @param requestCode 請求碼
- * @param permissions 權限
- */
- public void requestPermission(int requestCode, String... permissions) {
- ActivityCompat.requestPermissions(this, permissions, requestCode);
- }
-
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- switch (requestCode) {
- case PermissionsConstans.WRITE_STORAGE_CODE:
- if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- doSDCardPermission();
- } else {
- //TODO 提示用戶權限未授予
- Toast.makeText(BaseActivity.this, "WRITE_EXTERNAL_STORAGE 權限未開啟", Toast.LENGTH_SHORT).show();
- }
- break;
- case PermissionsConstans.CALL_PHONE_CODE:
- if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- doCallPhone();
- } else {
- //TODO 提示用戶權限未授予
- Toast.makeText(BaseActivity.this, "ACTION_CALL 權限未開啟", Toast.LENGTH_SHORT).show();
- }
- break;
- default:
- break;
- }
- }
-
-
- /**
- * 默認的寫SD權限處理
- */
- protected void doSDCardPermission() {
- //TODO
- }
-
- /**
- * 默認的打電話處理
- */
- protected void doCallPhone() {
- //TODO
- }
- }
Java代碼
- /**
- * BaseActivity
- *
- * @author Edwin.Wu
- * @version 2017/3/17 11:59
- * @since JDK1.8
- */
- public class PermissionActivity extends BaseActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_permission);
- }
-
- public void callPhone(View view) {
- if (hasPermission(android.Manifest.permission.CALL_PHONE)) {
- doCallPhone();
- } else {
- requestPermission(PermissionsConstans.CALL_PHONE_CODE, android.Manifest.permission.CALL_PHONE);
- }
- }
-
- public void sdCardPermission(View view) {
- if (hasPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
- doSDCardPermission();
- } else {
- requestPermission(PermissionsConstans.WRITE_STORAGE_CODE, android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
- }
- }
-
-
- @Override
- protected void doCallPhone() {
- Intent intent = new Intent(Intent.ACTION_CALL);
- intent.setData(Uri.parse("tel:" + "10000"));
- startActivity(intent);
- }
-
- @Override
- protected void doSDCardPermission() {
- OkHttpClient okHttpClient = new OkHttpClient();
- Request request = new Request
- .Builder()
- .url("http://img.mmjpg.com/2015/350/3.jpg")
- .get()
- .build();
- Call call = okHttpClient.newCall(request);
- call.enqueue(new Callback() {
- @Override
- public void onFailure(Call call, IOException e) {
-
- }
-
- @Override
- public void onResponse(Call call, Response response) throws IOException {
- ResponseBody body = response.body();
- InputStream is = body.byteStream();
- int len = 0;
- byte[] bytes = new byte[2048];
- String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + System.currentTimeMillis() + ".jpg";
- File file = new File(path);
- FileOutputStream fos = new FileOutputStream(file);
- while ((len = is.read(bytes)) != -1) {
- fos.write(bytes, 0, len);
- fos.flush();
- }
-
- Toast.makeText(PermissionActivity.this, "SDCard寫入成功", Toast.LENGTH_SHORT).show();
- Log.e("Edwin", "SDCard寫入成功");
- }
- });
-
-
- }
-
- }
Java代碼
- /**
- * PermissionGen框架
- *
- * @author Edwin.Wu
- * @version 2017/3/17 23:19
- * @since JDK1.8
- */
- public class PermissionGenActivity extends AppCompatActivity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_permission_gen);
- }
-
- public void openCamera(View view) {
- PermissionGen.needPermission(this, 200, Manifest.permission.CAMERA);
- }
-
- public void openGroup(View view) {
- PermissionGen
- .with(this)
- .addRequestCode(100)
- .permissions(
- Manifest.permission.READ_CONTACTS,
- Manifest.permission.RECEIVE_SMS,
- Manifest.permission.CAMERA,
- Manifest.permission.WRITE_CONTACTS)
- .request();
- }
-
-
- @PermissionSuccess(requestCode = 100)
- public void openGroupSuccess() {
- Toast.makeText(this, "Group Permission Success", Toast.LENGTH_SHORT).show();
- startActivity(new Intent(this, ContactActivity.class));
- }
-
- @PermissionFail(requestCode = 100)
- private void openGroupFail() {
- Toast.makeText(this, "Group permission is not granted", Toast.LENGTH_SHORT).show();
- }
-
- @PermissionSuccess(requestCode = 200)
- public void openCameraSuccess() {
- Toast.makeText(this, "Camera permission Success", Toast.LENGTH_SHORT).show();
- }
-
- @PermissionFail(requestCode = 200)
- public void openCameraFail() {
- Toast.makeText(this, "Camera permission is not granted", Toast.LENGTH_SHORT).show();
- }
-
- @Override
- public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
- PermissionGen.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
- }
- }
Java代碼
- /**
- * RxPermission框架
- *
- * @author Edwin.Wu
- * @version 2017/3/19 14:17
- * @since JDK1.8
- */
- public class RxPermissionActivity extends AppCompatActivity {
- private static final String TAG = "RxPermissionsSample";
- private Camera camera;
- private SurfaceView surfaceView;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- RxPermissions rxPermissions = new RxPermissions(this);
- rxPermissions.setLogging(true);
-
- setContentView(R.layout.activity_rx_permission);
-
- surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
-
- RxView.clicks(findViewById(R.id.enableCamera))
- // Ask for permissions when button is clicked
- .compose(rxPermissions.ensureEach(Manifest.permission.CAMERA))
- .subscribe(new Action1<Permission>() {
- @Override
- public void call(Permission permission) {
- Log.i(TAG, "Permission result " + permission);
- if (permission.granted) {
- releaseCamera();
- camera = Camera.open(0);
- try {
- camera.setPreviewDisplay(surfaceView.getHolder());
- camera.startPreview();
- } catch (IOException e) {
- Log.e(TAG, "Error while trying to display the camera preview", e);
- }
- } else if (permission.shouldShowRequestPermissionRationale) {
- // Denied permission without ask never again
- Toast.makeText(RxPermissionActivity.this, "Denied permission without ask never again", Toast.LENGTH_SHORT).show();
- } else {
- // Denied permission with ask never again
- // Need to go to the settings
- Toast.makeText(RxPermissionActivity.this, "Permission denied, can't enable the camera", Toast.LENGTH_SHORT).show();
- }
- }
- },
- new Action1<Throwable>() {
- @Override
- public void call(Throwable t) {
- Log.e(TAG, "onError", t);
- }
- },
- new Action0() {
- @Override
- public void call() {
- Log.i(TAG, "OnComplete");
- }
- });
- }
-
- @Override
- protected void onStop() {
- super.onStop();
- releaseCamera();
- }
-
- private void releaseCamera() {
- if (camera != null) {
- camera.release();
- camera = null;
- }
- }
- }