安卓6.0请求权限实现发短信打电话
来源:互联网 发布:淘宝生意参谋数据分析 编辑:程序博客网 时间:2024/05/18 13:27
安卓6.0的权限申请有了变化,更加安全了,具体变化不再多说了,
很多权限不再是简单的在注册清单里注册了。
找了一个工具类,使用起来还不错。
Github https://github.com/a5533348/XPermission
PermissionUtils.java
import android.annotation.TargetApi;import android.app.Activity;import android.content.Context;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.os.Build;import android.support.v4.app.ActivityCompat;import android.support.v4.content.PermissionChecker;import android.support.v4.util.SimpleArrayMap;/** * 权限工具类,引用PermissionsDispatcher中自带 * Created by Laiyimin on 2016/8/23. */public final class PermissionUtils { // Map of dangerous permissions introduced in later framework versions. // Used to conditionally bypass permission-hold checks on older devices. private static final SimpleArrayMap<String, Integer> MIN_SDK_PERMISSIONS; static { MIN_SDK_PERMISSIONS = new SimpleArrayMap<>(8); MIN_SDK_PERMISSIONS.put("com.android.voicemail.permission.ADD_VOICEMAIL", 14); MIN_SDK_PERMISSIONS.put("android.permission.BODY_SENSORS", 20); MIN_SDK_PERMISSIONS.put("android.permission.READ_CALL_LOG", 16); MIN_SDK_PERMISSIONS.put("android.permission.READ_EXTERNAL_STORAGE", 16); MIN_SDK_PERMISSIONS.put("android.permission.USE_SIP", 9); MIN_SDK_PERMISSIONS.put("android.permission.WRITE_CALL_LOG", 16); MIN_SDK_PERMISSIONS.put("android.permission.SYSTEM_ALERT_WINDOW", 23); MIN_SDK_PERMISSIONS.put("android.permission.WRITE_SETTINGS", 23); } private static volatile int targetSdkVersion = -1; private PermissionUtils() { } /** * Checks all given permissions have been granted. * * @param grantResults results * @return returns true if all permissions have been granted. */ public static boolean verifyPermissions(int... grantResults) { if (grantResults.length == 0) { return false; } for (int result : grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { return false; } } return true; } /** * Returns true if the Activity or Fragment has access to all given permissions. * * @param context context * @param permissions permission list * @return returns true if the Activity or Fragment has access to all given permissions. */ public static boolean hasSelfPermissions(Context context, String... permissions) { for (String permission : permissions) { if (permissionExists(permission) && !hasSelfPermission(context, permission)) { return false; } } return true; } /** * Returns true if the permission exists in this SDK version * * @param permission permission * @return returns true if the permission exists in this SDK version */ private static boolean permissionExists(String permission) { // Check if the permission could potentially be missing on this device Integer minVersion = MIN_SDK_PERMISSIONS.get(permission); // If null was returned from the above call, there is no need for a device API level check for the permission; // otherwise, we check if its minimum API level requirement is met return minVersion == null || Build.VERSION.SDK_INT >= minVersion; } /** * Determine context has access to the given permission. * <p/> * This is a workaround for RuntimeException of Parcel#readException. * For more detail, check this issue https://github.com/hotchemi/PermissionsDispatcher/issues/107 * * @param context context * @param permission permission * @return returns true if context has access to the given permission, false otherwise. * @see #hasSelfPermissions(Context, String...) */ private static boolean hasSelfPermission(Context context, String permission) { try { return PermissionChecker.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED; } catch (RuntimeException t) { return false; } } /** * Checks given permissions are needed to show rationale. * * @param activity activity * @param permissions permission list * @return returns true if one of the permission is needed to show rationale. */ public static boolean shouldShowRequestPermissionRationale(Activity activity, String... permissions) { for (String permission : permissions) { if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) { return true; } } return false; } /** * Get target sdk version. * * @param context context * @return target sdk version */ @TargetApi(Build.VERSION_CODES.DONUT) public static int getTargetSdkVersion(Context context) { try { if (targetSdkVersion != -1) { return targetSdkVersion; } PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); targetSdkVersion = packageInfo.applicationInfo.targetSdkVersion; } catch (PackageManager.NameNotFoundException ignored) { } return targetSdkVersion; }}
XPermissionActivity.java
import android.support.annotation.NonNull;import android.support.v4.app.ActivityCompat;import android.support.v7.app.AppCompatActivity;import android.widget.Toast;/** * Created by Laiyimin on 2016/8/23. */public class XPermissionActivity extends AppCompatActivity { /** * 权限回调Handler */ private PermissionHandler mHandler; /** * 请求权限 * * @param permissions 权限列表 * @param handler 回调 */ protected void requestPermission(String[] permissions, PermissionHandler handler) { if (PermissionUtils.hasSelfPermissions(this, permissions)) { handler.onGranted(); } else { mHandler = handler; ActivityCompat.requestPermissions(this, permissions, 001); } } /** * 权限请求结果 * * @param requestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (mHandler == null) return;// if (PermissionUtils.getTargetSdkVersion(this) < 23 && !PermissionUtils.hasSelfPermissions(this, permissions)) {// mHandler.onDenied();// return;// } if (PermissionUtils.verifyPermissions(grantResults)) { mHandler.onGranted(); } else { if (!PermissionUtils.shouldShowRequestPermissionRationale(this, permissions)) { if (!mHandler.onNeverAsk()) { Toast.makeText(this, "权限已被拒绝,请在设置-应用-权限中打开", Toast.LENGTH_SHORT).show(); } } else { mHandler.onDenied(); } } } /** * 权限回调接口 */ public abstract class PermissionHandler { /** * 权限通过 */ public abstract void onGranted(); /** * 权限拒绝 */ public void onDenied() { } /** * 不再询问 * * @return 如果要覆盖原有提示则返回true */ public boolean onNeverAsk() { return false; } }}
我们在使用的时候需要继承XPermissionActivity
发送短信权限请求
//发短信 private void requireSMS(final String phoneNumber,final String message){ requestPermission(new String[]{Manifest.permission.SEND_SMS}, new PermissionHandler() { @Override public void onGranted() { android.telephony.SmsManager smsManager = android.telephony.SmsManager.getDefault(); //拆分短信内容(手机短信长度限制) List<String> divideContents = smsManager.divideMessage(message); for (String text : divideContents) { smsManager.sendTextMessage(phoneNumber, null, text,null,null); } } @Override public boolean onNeverAsk() { new AlertDialog.Builder(MainActivity.this) .setTitle("权限申请") .setMessage("在设置-应用-权限中开始短信权限,以保证功能的正常使用") .setPositiveButton("去开启", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent); dialog.dismiss(); } }) .setNegativeButton("取消", null) .setCancelable(false) .show(); return true; } }); }
//打电话 private void requireCall(final String phonenumber){ requestPermission(new String[]{Manifest.permission.CALL_PHONE}, new PermissionHandler() { @Override public void onGranted() { Intent intent = new Intent(Intent.ACTION_CALL); Uri data = Uri.parse("tel:"+phonenumber); intent.setData(data); startActivity(intent); } @Override public boolean onNeverAsk() { new AlertDialog.Builder(MainActivity.this) .setTitle("权限申请") .setMessage("在设置-应用-权限中开始电话权限,以保证功能的正常使用") .setPositiveButton("去开启", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent); dialog.dismiss(); } }) .setNegativeButton("取消", null) .setCancelable(false) .show(); return true; } }); }
我们只需替换权限跟OnGranted要执行的内容就可以了。
Dangerous Permissions:
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
0 0
- 安卓6.0请求权限实现发短信打电话
- 安卓打电话,发短信
- Android安卓带头像电话本实现打电话、发短信功能(源码)
- 安卓源码之打电话和发短信
- android打电话、发短信实现
- android打电话、发短信实现
- Android实现发短信,打电话
- 两个android模拟器 实现 打电话 发短信
- android实现打电话 发短信功能
- iOS中实现打电话、发短信
- 【Android】打电话与发短信的实现
- Sim900+单片机开发,实现打电话发短信
- Android 实现打电话和发短信
- Android实现打电话和发短信
- 安卓开发之意图对象篇 比如打电话 发短信
- 安卓开发:webapp 打电话,发短信时的代码设置
- android打电话,发短信
- android打电话,发短信
- request&ServletContex,session,cookies域与应用
- php运行模式
- POJ3087Shuffle'm Up
- 深入理解javascript原型和闭包(10)——this
- 支持向量机原理(四)SMO算法原理
- 安卓6.0请求权限实现发短信打电话
- ORM简介
- 百钱买百鸡问题(难度:半颗星)
- 计算圆柱面积
- 【WPF】MVVM动态修改Bingding的另一种思路——用Style样式
- 二叉树的基本操作
- python彩色图转化为灰度图
- ARM微处理器第一弹:工作状态,存储器格式,指令长度,工作模式
- [leetcode: Python]237. Delete Node in a Linked List