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;
}
}
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# android
# 6.0
# 权限
# 权限申请
# 6.0动态申请权限
# 安卓6.0动态权限
# Android registerForActivityResult动态申请权限案例详解
# Android 如何实现动态申请权限
# android6.0权限动态申请框架permissiondispatcher的方法
# Android6.0动态申请权限所遇到的问题小结
# Android中不支持动态申请权限的原因
# Android动态权限申请实现步骤分解
# 的是
# 更低
# 或更高
# 子类
# 只需
# 会在
# 要在
# 提供一个
# 参考资料
# 用在
# 则应
# 每组
# 共分为
# 使用了
# 只要有
# SET_WALLPAPER
# REQUEST_INSTALL_PACKAGES
# RECEIVE_BOOT_COMPLETED
# SET_TIME_ZONE
# REORDER_TASKS
相关文章:
如何在IIS中新建站点并解决端口绑定冲突?
无锡营销型网站制作公司,无锡网选车牌流程?
简单实现Android文件上传
上海网站制作开发公司,上海买房比较好的网站有哪些?
如何通过可视化优化提升建站效果?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
制作旅游网站html,怎样注册旅游网站?
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
建站主机选择指南:服务器配置与SEO优化实战技巧
在线教育网站制作平台,山西立德教育官网?
如何用免费手机建站系统零基础打造专业网站?
如何快速搭建高效服务器建站系统?
购物网站制作公司有哪些,哪个购物网站比较好?
如何高效完成独享虚拟主机建站?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
jQuery 常见小例汇总
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
网站微信制作软件,如何制作微信链接?
如何在阿里云ECS服务器部署织梦CMS网站?
Android滚轮选择时间控件使用详解
如何设计高效校园网站?
如何通过老薛主机一键快速建站?
如何用西部建站助手快速创建专业网站?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
如何访问已购建站主机并解决登录问题?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
建站主机是否属于云主机类型?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
Swift中循环语句中的转移语句 break 和 continue
如何选择最佳自助建站系统?快速指南解析优劣
广州建站公司哪家好?十大优质服务商推荐
视频网站制作教程,怎么样制作优酷网的小视频?
深圳网站制作平台,深圳市做网站好的公司有哪些?
制作网站怎么制作,*游戏网站怎么搭建?
企业微网站怎么做,公司网站和公众号有什么区别?
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
广东企业建站网站优化与SEO营销核心策略指南
广州商城建站系统开发成本与周期如何控制?
Android自定义listview布局实现上拉加载下拉刷新功能
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
音响网站制作视频教程,隆霸音响官方网站?
如何用景安虚拟主机手机版绑定域名建站?
公众号网站制作网页,微信公众号怎么制作?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
开封网站制作公司,网络用语开封是什么意思?
大连网站设计制作招聘信息,大连投诉网站有哪些?
专业网站建设制作报价,网页设计制作要考什么证?
*请认真填写需求信息,我们会在24小时内与您取得联系。