安卓6.0請求許可權實現發簡訊打電話
阿新 • • 發佈:2019-02-03
安卓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