6.0动态请求权限

普通权限(不用在用的的地方动态申请)Normal Permissions如下
ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS


危险权限(安卓6.0及之后需要动态请求)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

1、Activity中动态申请权限

//定位动态申请权限
    private boolean gpsPermission() {
        if (ContextCompat.checkSelfPermission(MyActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            //只是拒绝
            if (ActivityCompat.shouldShowRequestPermissionRationale(MyActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)) {
                ActivityCompat.requestPermissions(MyActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 2);// 动态请求权限
            } else {//拒绝后不再询问
                DialogUtils.showDialog(MyActivity.this, "权限提醒", "由于无法获取定位权限,不能正常使用此功能,请到以下路径进行设置:\n设置->应用名称->权限", "去设置", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        PermissionUtil.openSetting(MyActivity.this);
                    }
                });//该功能需要获取定位权限,
            }
            return false;
        }
        return true;
    }

//通讯录动态申请权限
    private boolean directoriesPermission() {
        if (ContextCompat.checkSelfPermission(MyActivity.this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
            //只是拒绝
            if (ActivityCompat.shouldShowRequestPermissionRationale(MyActivity.this, Manifest.permission.READ_CONTACTS)) {
                ActivityCompat.requestPermissions(MyActivity.this, new String[]{Manifest.permission.READ_CONTACTS}, 1);// 动态请求权限
            } else {//拒绝后不再询问
                DialogUtils.showDialog(MyActivity.this, "权限提醒", "由于无法获取读取通讯录权限,不能正常使用此功能,请到以下路径进行设置:\n设置->应用名称->权限", "去设置", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        PermissionUtil.openSetting(MyActivity.this);
                    }
                });//该功能需要读取通讯录权限,
            }
            return false;
        }
        return true;
    }
public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.item_points_directories:
            //使用 调通讯录
            if (directoriesPermission()) {
                startActivityForResult(new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI), S_DIR);
            }
            break;
            default:
                break;
        }}

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == Activity.RESULT_OK) {
            switch (requestCode) {
                case 1:  //通讯录回调
                    getDirectories(data);
                    break;
                default:
                    break;
            }
        }
    }
    /**
     * 调取通讯录
     *
     * @param data
     * @param isSend
     */
    public void getDirectories(Intent data) {
        //        ContentProvider展示数据类似一个单个数据库表
        //        ContentResolver实例带的方法可实现找到指定的ContentProvider并获取到ContentProvider的数据
        ContentResolver reContentResolverol = getContentResolver();
        //URI,每个ContentProvider定义一个唯一的公开的URI,用于指定到它的数据集
        Uri contactData = data.getData();
        //查询就是输入URI等参数,其中URI是必须的,其他是可选的,如果系统能找到URI对应的ContentProvider将返回一个Cursor对象.
        //            Cursor cursor = managedQuery(contactData, null, null, null, null);
        Cursor cursor;
        if (Build.VERSION.SDK_INT < 11) {
            cursor = managedQuery(contactData, null, null, null, null);
        } else {
            CursorLoader cursorLoader = new CursorLoader(this, contactData, null, null, null, null);
            cursor = cursorLoader.loadInBackground();
        }
        boolean flag = cursor.moveToFirst();
        if (!flag) {
            showTextToast("请重新选择");
            return;
        }
        //获得DATA表中的名字
        String username = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        //条件为联系人ID
        String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
        // 获得DATA表中的电话号码,条件为联系人ID,因为手机号码可能会有多个
        Cursor phone = reContentResolverol.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
        while (phone.moveToNext()) {
            String usernumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)).trim();
        }
        cursor.close();
    }
2、Fragment中动态申请权限
//拍照动态申请权限
    private boolean CameraPermission() {
        if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            //只是拒绝
            if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.CAMERA)) {
                FirstFragment.this.requestPermissions(new String[]{Manifest.permission.CAMERA}, 4);// 动态请求权限
            } else {//拒绝后不再询问
                DialogUtils.showDialog(getActivity(), "权限提醒", "由于无法获取获取拍照权限,不能正常使用此功能,请到以下路径进行设置:\n设置->应用名称->权限", "去设置", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                        PermissionUtil.openSetting(getActivity());
                    }
                });
            }
            return false;
        }
        return true;
    }
3、打开设置界面
/**
     * 打开系统的该应用的设置页面
     *
     * @param activity
     */
    public static void openSetting(Activity activity) {
        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= 9) {
            intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
            intent.setData(Uri.fromParts("package", activity.getPackageName(), null));
        } else if (Build.VERSION.SDK_INT <= 8) {
            intent.setAction(Intent.ACTION_VIEW);
            intent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");
            intent.putExtra("com.android.settings.ApplicationPkgName", activity.getPackageName());
        }
        activity.startActivity(intent);
    }

    /**
     * 打开市场的该应用的设置页面
     *
     * @param activity
     */
    public static void openMarkSetting(Activity activity) {
        Uri uri = Uri.parse("market://details?id=order.lbex");
        Intent it = new Intent(Intent.ACTION_VIEW, uri);
        activity.startActivity(it);
    }

    /**
     * 打开GPS的设置页面
     *
     * @param activity
     */
    public static void openGpsSetting(Activity activity) {
        // 转到手机设置界面,用户设置GPS
        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        //activity.startActivityForResult(intent, 0); // 设置完成后返回到原来的界面
        activity.startActivity(intent); // 设置完成后返回到原来的界面
    }

    /**
     * 打开WIFI的设置页面
     *
     * @param activity
     */
    public static void openWifiSetting(Activity activity) {
        // 转到手机设置界面,用户设置WIFI
        Intent it = new Intent();
        ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.wifi.WifiSettings");
        it.setComponent(cn);
        activity.startActivity(it);// 设置完成后返回到原来的界面
    }
注意:
在Activity中动态请求权限:ActivityCompat.requestPermissions(this, new String[{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
在Fragment中动态请求权限时不是使用AcyivityCompat而是使用Fragment本身:
HomeFragment.this.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);

感谢以下博文的各位博主,谢谢各位!如有不妥的地方,请各位博主评论区留言,本人看到会立刻处理。
点击打开链接 http://blog.csdn.net/lmj623565791/article/details/50709663
点击打开链接 http://m.blog.csdn.net/KjunChen/article/details/51366845
点击打开链接 http://www.cnblogs.com/mengdd/p/4892856.html
点击打开链接 http://blog.csdn.net/aminfo/article/details/7599858
点击打开链接 http://blog.csdn.net/xiaoqiang_0719/article/details/53009323
点击打开链接 http://blog.csdn.net/u014137988/article/details/52224544


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值