Android 6.0动态权限申请教程

作者:Edwin05 时间:2023-09-26 16:43:56 

PermissionManage

项目地址:https://github.com/why168/AndroidProjects/tree/master/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组,每组只要有一个权限申请成功了,就默认整组权限都可以使用了


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中申请即可


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

示例代码


/**
* 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
}
}

/**
* 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写入成功");
}
});
}
}

/**
* 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);
}
}

/**
* RxPermissionGen框架
*
* @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;
}
}
}

来源:http://www.cnblogs.com/why168888/p/6580396.html

标签:android,6.0,权限
0
投稿

猜你喜欢

  • Java 处理超大数类型之BigInteger案例详解

    2021-06-20 15:36:38
  • SpringMVC中RequestBody注解的List参数传递方式

    2023-06-29 09:56:04
  • SpringBoot2.0+阿里巴巴Sentinel动态限流实战(附源码)

    2021-05-25 18:52:47
  • idea 如何查找类中的某个方法

    2022-03-17 17:17:42
  • C#正则表达式转义字符介绍

    2022-11-03 01:10:09
  • 如何从dump文件中提取出C#源代码

    2022-09-13 19:54:54
  • Java Apache common-pool对象池介绍

    2022-08-24 22:53:06
  • java实现工资管理简单程序

    2021-12-29 22:40:58
  • Android开发应用中Broadcast Receiver组件详解

    2023-04-25 09:35:35
  • C# 遍历文件夹子目录下所有图片及遍历文件夹下的文件

    2022-03-12 02:55:47
  • java实现手写一个简单版的线程池

    2022-09-29 04:59:32
  • Springboot全局异常捕获及try catch区别解析

    2022-03-02 17:44:07
  • 通过FeignClient调用微服务提供的分页对象IPage报错的解决

    2022-01-27 20:19:23
  • Android 8.0系统中应用图标的适配微技巧

    2022-09-29 00:22:26
  • Java编程中ArrayList源码分析

    2023-05-20 00:05:25
  • WinForm判断关闭事件来源于用户点击右上角“关闭”按钮的方法

    2021-05-28 13:00:43
  • Spring RabbitMQ死信机制原理实例详解

    2022-04-29 18:52:18
  • Android实战教程第五篇之一键锁屏应用

    2023-12-03 18:47:36
  • 在C#中global关键字的作用及其用法

    2021-12-24 04:33:19
  • 代码详解Java猴子选王问题(约瑟夫环)

    2023-09-16 07:33:43
  • asp之家 软件编程 m.aspxhome.com