• Android Runtime Permission1,运行时权限说明: Android运行时权限,是Android6.0新加的功能点。当我们想要把我们的app适配到6.0 以及以上的时候,我们需要对运行时权限做些操作,否则很容易会造成程序崩溃,当我们...

    Android Runtime Permission

    1,运行时权限说明:

     Android运行时权限,是Android6.0新加的功能点。当我们想要把我们的app适配到6.0 以及以上的时候,我们需要对运行时权限做些操作,否则很容易会造成程序崩溃,当我们运行在6.0系统的时候。
    

    2,常见权限:

    //    6.0权限的基本知识,以下是需要单独申请的权限,
        // 共分为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 //第七组  允许程序写入外部存储,如SD卡上写文件
    //    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

    3,google 官方的介绍:

    官方运行时demo:https://github.com/bonaparteI/android-RuntimePermissions-master
    

    1,官方demo中 :

        先看效果图 (以下为我翻译后的界面):
    

    这里写图片描述这里写图片描述

        google官方的demo 还是比较不错的。但对于权限的处理。我感觉还是不够完善。当我们碰到适配问题时就暴露无疑。
        比如小米对于 shouldShowRequestPermissionRationale方法 的处理。
    
    若按照google的处理方式:处理显然不够完善。
    

    4,于是乎 我写了一个 权限请求处理的demo。供大家参考。

    先看效果图:左边是直接请求权限的处理方式,右边是对权限先做检查后做处理的方式。
    

    这里写图片描述这里写图片描述

    5 逻辑说明:

    1,首先我们要知道我们申请权限是需要在  Mainfest.xml 中注册的。默认不注册的权限是不被准许的。直接申请权限存在App崩溃的潜在风险:
    
    //                直接申请  不做权限检查:执行流程:请求权限---弹出Dialog(要允许App申请权限吗?)---拒绝||允许
    //                                  拒绝情况:再次点击:请求权限----弹出Dialog(带有不再询问对话框checkBox)---拒绝||允许
    //                                  拒绝情况:再次点击:之前未勾选不再询问的checkBox:   此时效果同上。
    //                                  拒绝情况:再次点击:之前勾选了不再询问的checkBox:   此时不再提示对话框,但会回调onRequestPermissionsResult打印6权限被拒绝。
                    directRequestPermisssion(Manifest.permission.READ_CONTACTS,REQUEST_CONTACTS_CODE);
    
    
    //.....
       /**
         * 直接  请求 权限
         * @param permission 权限
         * @param resultCode 结果码
         */
        protected void directRequestPermisssion(String permission,int resultCode){
            ActivityCompat.requestPermissions(this, new String[]{permission}, resultCode);
        }
    
    2,几个重要方法:
    
    
    /**
         * Determine whether <em>you</em> have been granted a particular permission.
         *
         * @param permission The name of the permission being checked.
         *
         * @return {@link android.content.pm.PackageManager#PERMISSION_GRANTED} if you have the
         * permission, or {@link android.content.pm.PackageManager#PERMISSION_DENIED} if not.
         *
         * @see android.content.pm.PackageManager#checkPermission(String, String)
         */
        public static int checkSelfPermission(@NonNull Context context, @NonNull String permission) {
            if (permission == null) {
                throw new IllegalArgumentException("permission is null");
            }
    
            return context.checkPermission(permission, android.os.Process.myPid(), Process.myUid());
        }
    
    //=============================================================
    /**
         * Requests permissions to be granted to this application. These permissions
         * must be requested in your manifest, they should not be granted to your app,
         * and they should have protection level {@link android.content.pm.PermissionInfo
         * #PROTECTION_DANGEROUS dangerous}, regardless whether they are declared by
         * the platform or a third-party app.
         * <p>
         * Normal permissions {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL}
         * are granted at install time if requested in the manifest. Signature permissions
         * {@link android.content.pm.PermissionInfo#PROTECTION_SIGNATURE} are granted at
         * install time if requested in the manifest and the signature of your app matches
         * the signature of the app declaring the permissions.
         * </p>
         * <p>
         * If your app does not have the requested permissions the user will be presented
         * with UI for accepting them. After the user has accepted or rejected the
         * requested permissions you will receive a callback reporting whether the
         * permissions were granted or not. Your activity has to implement {@link
         * android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback}
         * and the results of permission requests will be delivered to its {@link
         * android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback#onRequestPermissionsResult(
         * int, String[], int[])} method.
         * </p>
         * <p>
         * Note that requesting a permission does not guarantee it will be granted and
         * your app should be able to run without having this permission.
         * </p>
         * <p>
         * This method may start an activity allowing the user to choose which permissions
         * to grant and which to reject. Hence, you should be prepared that your activity
         * may be paused and resumed. Further, granting some permissions may require
         * a restart of you application. In such a case, the system will recreate the
         * activity stack before delivering the result to your
         * {@link OnRequestPermissionsResultCallback#onRequestPermissionsResult(int, String[], int[])}.
         * </p>
         * <p>
         * When checking whether you have a permission you should use {@link
         * #checkSelfPermission(android.content.Context, String)}.
         * </p>
         * <p>
         * Calling this API for permissions already granted to your app would show UI
         * to the user to decided whether the app can still hold these permissions. This
         * can be useful if the way your app uses the data guarded by the permissions
         * changes significantly.
         * </p>
         * <p>
         * You cannot request a permission if your activity sets {@link
         * android.R.attr#noHistory noHistory} to <code>true</code> in the manifest
         * because in this case the activity would not receive result callbacks including
         * {@link OnRequestPermissionsResultCallback#onRequestPermissionsResult(int, String[], int[])}.
         * </p>
         * <p>
         * The <a href="http://developer.android.com/samples/RuntimePermissions/index.html">
         * RuntimePermissions</a> sample app demonstrates how to use this method to
         * request permissions at run time.
         * </p>
         *
         * @param activity The target activity.
         * @param permissions The requested permissions. Must me non-null and not empty.
         * @param requestCode Application specific request code to match with a result
         *    reported to {@link OnRequestPermissionsResultCallback#onRequestPermissionsResult(int, String[], int[])}.
         *    Should be >= 0.
         *
         * @see OnRequestPermissionsResultCallback#onRequestPermissionsResult(int, String[], int[])
         * @see #checkSelfPermission(android.content.Context, String)
         * @see #shouldShowRequestPermissionRationale(android.app.Activity, String)
         */
        public static void requestPermissions(final @NonNull Activity activity,
                final @NonNull String[] permissions, final @IntRange(from = 0) int requestCode) {
            if (Build.VERSION.SDK_INT >= 23) {
                ActivityCompatApi23.requestPermissions(activity, permissions, requestCode);
            } else if (activity instanceof OnRequestPermissionsResultCallback) {
                Handler handler = new Handler(Looper.getMainLooper());
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        final int[] grantResults = new int[permissions.length];
    
                        PackageManager packageManager = activity.getPackageManager();
                        String packageName = activity.getPackageName();
    
                        final int permissionCount = permissions.length;
                        for (int i = 0; i < permissionCount; i++) {
                            grantResults[i] = packageManager.checkPermission(
                                    permissions[i], packageName);
                        }
    
                        ((OnRequestPermissionsResultCallback) activity).onRequestPermissionsResult(
                                requestCode, permissions, grantResults);
                    }
                });
            }
        }
    
    //==========================================================================
     /**
         * Gets whether you should show UI with rationale for requesting a permission.
         * You should do this only if you do not have the permission and the context in
         * which the permission is requested does not clearly communicate to the user
         * what would be the benefit from granting this permission.
         * <p>
         * For example, if you write a camera app, requesting the camera permission
         * would be expected by the user and no rationale for why it is requested is
         * needed. If however, the app needs location for tagging photos then a non-tech
         * savvy user may wonder how location is related to taking photos. In this case
         * you may choose to show UI with rationale of requesting this permission.
         * </p>
         *
         * @param activity The target activity.
         * @param permission A permission your app wants to request.
         * @return Whether you can show permission rationale UI.
         *
         * @see #checkSelfPermission(android.content.Context, String)
         * @see #requestPermissions(android.app.Activity, String[], int)
         */
        public static boolean shouldShowRequestPermissionRationale(@NonNull Activity activity,
                @NonNull String permission) {
            if (Build.VERSION.SDK_INT >= 23) {
                return ActivityCompatApi23.shouldShowRequestPermissionRationale(activity, permission);
            }
            return false;
        }
    楼主也基本看不懂但大致意思是:
    checkPermission():检查权限。requestPermissions()请求权限。shouldShowRequestPermissionRationale():是否应该请求权限(注意该方法,小米对于该方法一直返回false)。
    
    经楼主反复测试:
    第一个主要是用于检查权限是否被用户准许过。
    第二个方法主要是用来请求权限。
    第三个怎么解释呢?我直接说返回结果吧:当用户第一次拒绝过之后该方法会一直返回false。其他返回true。(该方法在小米手机中会一直返回false。开发者需注意适配问题。)
    
    上面说的适配问题怎么解决呢?
    楼主是在权限请求结果中添加了一次判断:当用户拒绝权限后,再次弹出dialog提醒权限的重要性。用户可以选择取消或者打开设置界面进行设置。
    //TODO  解释为什么  需要该权限的  对话框
    showMissingPermissionDialog();
    
    
    小米手机返回图片截图:
    

    这里写图片描述这里写图片描述

    over。

    楼主对activity进行了权限请求的封装,需要请求权限的可以直接拿走,修改需要请求的权限即可。。

    github:
    https://github.com/zqHero/PermissionDemo2

    如果对你有帮助 欢迎fork 和star

    参考:

    https://github.com/bonaparteI/android-RuntimePermissions-master
    http://blog.csdn.net/yanzhenjie1003/article/details/52503533/

    展开全文
  • /****************** Android SDK22 读写手机存储权限获取问题处理方法 **************************/ @NeedsPermission({Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.W...

    针对小米手机sdk22以下sdk获取不到文件 存储权限问题。
     

    /****************** Android SDK22 读写手机存储权限获取问题处理方法 **************************/
        @NeedsPermission({Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE})
        void externalStorage() {
            // 是否需要重启
            if (KDApplication.getInstance().isReStartApp()){
                isReStartAppDialog(this);
            }else {
                chouseHeadImg();
            }
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
           UserInfoActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
        }
    
        @OnShowRationale({Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE})
        void externalStorageShow(final PermissionRequest request) {
        }
    
        @OnPermissionDenied({Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE})
        void externalStorageDenied() {
            openPermissionDialog(UserInfoActivity.this,"读写手机存储");
        }
    
        @OnNeverAskAgain({Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE})
        void externalStorageNeverAskAgain() {
        }
    
        private AlertDialog.Builder dialogBuilder;
        private AlertDialog dialog;
        /**
         * 打开手机权限设置对话框
         *
         * @param permission
         */
        public void openPermissionDialog(final Activity activity, String permission) {
            dialogBuilder = new AlertDialog.Builder(activity);
            dialogBuilder.setTitle("手机权限申请");
            dialogBuilder.setMessage("\t\t使用该功能需要开启 <" + permission + "权限> 请点击 [前往设置页面] 进行设置,并重启APP");
            dialogBuilder.setPositiveButton("前往设置页面", (dialog1, which) -> {
                // 前往设置页面
                activity.startActivity(PermissionsPageManager.getSettingIntent(
                        activity));
                dialog.dismiss();
                KDApplication.getInstance().setReStartApp(true);
            } );
            dialogBuilder.setNegativeButton("取消", (dialog1, which) -> {
                dialog.dismiss();
            } );
            dialog=dialogBuilder.show();
        }
    
        /**
         * 是否需要重启对话框
         */
        public void isReStartAppDialog(final Activity activity) {
            dialogBuilder = new AlertDialog.Builder(activity);
            dialogBuilder.setTitle("是否需要重启");
            dialogBuilder.setMessage("\t\t如果修改了APP权限设置,需要重启APP才可正常使用,是否重启App?");
            dialogBuilder.setPositiveButton("重启App", (dialog1, which) -> {
                reStartApp();
                KDApplication.getInstance().setReStartApp(false);
            } );
            dialogBuilder.setNegativeButton("取消", (dialog1, which) -> {
                dialog.dismiss();
            } );
            dialog=dialogBuilder.show();
        }
    
        /**
         * 重启App
         */
        public void reStartApp()
        {
            Intent intent = new Intent(UserInfoActivity.this, SplashActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);
            android.os.Process.killProcess(android.os.Process.myPid());
        }
        /****************** Android SDK22 读写手机存储权限获取问题处理方法 **************************/

    使用了PermissionsDispatcher和Permissions4m核心代码。
    PermissionsDispatcher github 地址:https://github.com/permissions-dispatcher/PermissionsDispatcher
    Permissions4m github 地址:https://github.com/jokermonn/permissions4m
    PermissionsPageManager github 地址:https://github.com/HHaobin/PermissionManager

    小米手机图片调用剪裁图片失败可参考:https://blog.csdn.net/qq_33731155/article/details/86595824

    展开全文
  • 对于6.0以下的权限及在安装的时候,根据权限声明产生一个权限列表,用户只有在同意之后才能完成app的安装,造成了我们想要使用某个app,就要默默忍受其一些不必要的权限(比如是个app都要访问通讯录、短信等)。...

    对于6.0以下的权限及在安装的时候,根据权限声明产生一个权限列表,用户只有在同意之后才能完成app的安装,造成了我们想要使用某个app,就要默默忍受其一些不必要的权限(比如是个app都要访问通讯录、短信等)。而在6.0以后,我们可以直接安装,当app需要我们授予不恰当的权限的时候,我们可以予以拒绝(比如:获取相机权限)。当然你也可以在设置界面对每个app的权限进行查看,以及对单个权限进行授权或者解除授权。

    新的权限机制更好的保护了用户的隐私,Google将权限分为两类,一类是Normal Permissions,这类权限一般不涉及用户隐私,是不需要用户进行授权的,比如手机震动、访问网络等;另一类是Dangerous Permission,一般是涉及到用户隐私的,需要用户进行授权,比如读取sdcard、访问通讯录,获取摄像头等。

    正常的运行时权限流程如下:

    1. 在AndroidManifest文件中添加需要的权限。

      这个步骤和我们之前的开发并没有什么变化,试图去申请一个没有声明的权限可能会导致程序崩溃。

    2. 检查权限

      if (ContextCompat.checkSelfPermission(thisActivity,
                      Manifest.permission.READ_CONTACTS)
              != PackageManager.PERMISSION_GRANTED) {
      }else{
          //
      }
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      这里涉及到一个API,ContextCompat.checkSelfPermission,主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。当返回DENIED就需要进行申请授权了。

    3. 申请授权

       ActivityCompat.requestPermissions(thisActivity,
                      new String[]{Manifest.permission.READ_CONTACTS},
                      MY_PERMISSIONS_REQUEST_READ_CONTACTS);
      • 1
      • 2
      • 3

      该方法是异步的,第一个参数是Context;第二个参数是需要申请的权限的字符串数组;第三个参数为requestCode,主要用于回调的时候检测。可以从方法名requestPermissions以及第二个参数看出,是支持一次性申请多个权限的,系统会通过对话框逐一询问用户是否授权。

    4. 处理权限申请回调

      @Override
      public void onRequestPermissionsResult(int requestCode,
              String permissions[], int[] grantResults) {
          switch (requestCode) {
              case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                  // If request is cancelled, the result arrays are empty.
                  if (grantResults.length > 0
                      && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
      
                      // permission was granted, yay! Do the
                      // contacts-related task you need to do.
      
                  } else {
      
                      // permission denied, boo! Disable the
                      // functionality that depends on this permission.
                  }
                  return;
              }
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22

      ok,对于权限的申请结果,首先验证requestCode定位到你的申请,然后验证grantResults对应于申请的结果,这里的数组对应于申请时的第二个权限字符串数组。如果你同时申请两个权限,那么grantResults的length就为2,分别记录你两个权限的申请结果。如果申请成功,就可以做你的事情了~

    ---------------------------------------------------------------------华丽的分割线----------------------------------------------------------

    你以为这样就大功告成了吗,too young too native,不得不说我们国产手机厂商早已把原生系统权限改的面目全非了,如果你按照上边的方式去写权限检测,那么恭喜你,你可以卷铺盖走人了。。。。经过多次尝试与修正,总结了一套android相机权限申请方案,供各位看官欣赏:

    public void requestNyPermisson() {
        String[] permissionArray = {Manifest.permission.CAMERA};
        if (Build.VERSION.SDK_INT >= 23) {
            if (MyApp.preferenceUtils.getBoolean("isFirstLiving", true)) {
                isCameraUseable();
            } else {
                requestPermissions(permissionArray, 200);
            }
            MyApp.preferenceUtils.putBoolean("isFirstLiving", false);
    
        } else {
            if (MyApp.preferenceUtils.getBoolean("isFirstLiving", true)) {
                isCameraUseable();
            } else {
                isCameraUseable();
            }
            MyApp.preferenceUtils.putBoolean("isFirstLiving", false);
        }
    }
    接下来就是特别重要的一个检查app是否获取摄像头的一个方法,特别重要,特别重要,特别重要

    public boolean isCameraUseable() {
    
        boolean canUse = true;
    
        Camera mCamera = null;
    
        try {
            mCamera = Camera.open();
            // setParameters 是针对魅族MX5。MX5通过Camera.open()拿到的Camera对象不为null
            Camera.Parameters mParameters = mCamera.getParameters();
            mCamera.setParameters(mParameters);
            canUse = true;
            MyApp.preferenceUtils.putBoolean("CamcanUse", true);
        } catch (Exception e) {
            canUse = false;
            MyApp.preferenceUtils.putBoolean("CamcanUse", false);
            DialogUtil.showGotoSettingDialog(AutherActivity.this);
        } finally {
            if (mCamera != null) {
                mCamera.release();
            }
            if (canUse) {
                startLivenessActivity();//开启活体检测页面
            }
        }
        return canUse;
    }
    对于部分手机采用android系统提供的请求权限回调方法:

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            startLivenessActivity();
        } else if (grantResults.length == 0) {//针对小米手机
            isCameraUseable();
        } else {
            // Permission request was denied.
            DialogUtil.showGotoSettingDialog(this);
        }
    
    }

    跳去系统设置页面:

    /**
     * 去设置对话框
     */
    public static Dialog showGotoSettingDialog(final Activity context) {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        View view = ((Activity) context).getLayoutInflater().inflate(R.layout.dialog_portrait_auth, null);
        TextView tv_dialog_btn_text = (TextView) view.findViewById(R.id.tv_dialog_btn_text);
        TextView tvSecTitle = (TextView) view.findViewById(R.id.tv_dialog_second_text);
        TextView tv_dialog_title = (TextView) view.findViewById(R.id.tv_dialog_title);
        TextView tv_introduct_text = (TextView) view.findViewById(R.id.tv_introduct_text);
        ImageView iv_close_set = (ImageView) view.findViewById(R.id.iv_close_set);
        iv_close_set.setVisibility(View.VISIBLE);
        tv_dialog_btn_text.setText("去设置");
        tvSecTitle.setVisibility(View.GONE);
        tv_dialog_title.setVisibility(View.GONE);
        tv_introduct_text.setVisibility(View.VISIBLE);
        builder.setView(view);
        final Dialog dialog = builder.create();
        final WindowManager.LayoutParams lp = context.getWindow().getAttributes();
        lp.alpha = 0.6f;
        context.getWindow().setAttributes(lp);
        //context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        dialog.setCanceledOnTouchOutside(false);
        dialog.setCancelable(false);
        if (!context.isFinishing()) {
            dialog.show();
        }
        tv_dialog_btn_text.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
                lp.alpha = 1f;
                context.getWindow().setAttributes(lp);
                goToAppSetting(context);
            }
        });
        iv_close_set.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
                lp.alpha = 1f;
                context.getWindow().setAttributes(lp);
    
            }
        });
        return dialog;
    }

    // 跳转到当前应用的设置界面
    private static void goToAppSetting(Activity context) {
        Intent localIntent = new Intent();
        localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= 9) {
            localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
            localIntent.setData(Uri.fromParts("package", context.getPackageName(), null));
        } else if (Build.VERSION.SDK_INT <= 8) {
            localIntent.setAction(Intent.ACTION_VIEW);
            localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");
            localIntent.putExtra("com.android.settings.ApplicationPkgName", context.getPackageName());
        }
        context.startActivity(localIntent);
        //context.finish();
    }
    相信各位看官知道如何处理了,接下来我把需求贴一下,以便大家更好的理解


    到处,整个过程结束-----------------------

    展开全文
  • //这是权限的问题 因为小米安卓7.0以后 添加要的 动态权限 怎么添加呢? package com.example.administrator.text; import android.Manifest; import android.content.pm.PackageManager; import ...



    //这是权限的问题   因为小米安卓7.0以后   添加要的   动态权限    怎么添加呢?



       
    package com.example.administrator.text;
    
    import android.Manifest;
    import android.content.pm.PackageManager;
    import android.media.Image;
    import android.os.Environment;
    import android.support.annotation.NonNull;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.content.ContextCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    import com.bumptech.glide.Glide;
    import com.google.gson.Gson;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.HashMap;
    
    import okhttp3.Call;
    import okhttp3.Callback;
    import okhttp3.Response;
    
    public class MainActivity extends AppCompatActivity {
    
        private ImageView image;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            image = findViewById(R.id.image);
    
        }
    
        public void play(View view) {
            //添加动态权限     让你点击是否允许当前应用是否可以访问你的媒体资源时候
    
            //这段话 的意思   如果读的权限没有授权
            if (ContextCompat.checkSelfPermission(this,
     Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                //就跳到让用户选择是否授权  给个码走返回方法
                ActivityCompat.requestPermissions(this, 
    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1001);
            } else {
                //有权限时候 我要上传我的方法
                upload();
            }
    
    
        }
    
        //当我申请权限的时候,调用
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
     @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            //如果用户选择了同意授权     走我的方法
            if (requestCode == 1001) {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    upload();
                } else {
                    // Permission Denied
                    Toast.makeText(MainActivity.this, "Permission Denied  权限拒绝",
     Toast.LENGTH_SHORT).show();
                }
            }
    
    
        }
    
        private void upload() {
            File file = new File(Environment.getExternalStorageDirectory(), "/aaa/yi.jpg");
            Log.d("TAG", file.getAbsolutePath() + "----------" + file.exists());
            HashMap<String, String> map = new HashMap<>();
            map.put("uid", "4123");
            OkHttp3Util.uploadFile("https://www.zhaoapi.cn/file/upload", file,
     "long.jpg", map, new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.d("TAG", "----------" + e.getMessage());
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
    
                    Log.d("TAG", "----------");
                    if (response.isSuccessful()) {
                        final String string = response.body().string();
                        Log.d("TAG", "----------" + string);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(MainActivity.this, string + "上传",
     Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
    
    
                }
            });
        }
    }
    

    展开全文
  • 获取权限如下: &lt;uses-permission android:name="android.permission.WRITE_SETTINGS" /&gt; &lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&...
    获取权限如下:
         <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_OWNER_DATA"/>
    在版本22以下得不到权限,文件不能读取。

    我们修改我们的包名,看看你的包名是不是有特殊的单词,我的项目是由于filemanager的原因,换掉这个单词就是可以的。

    我个人认为这是 由于小米系统有原本的应用于你的包名冲突。你在单词之间加上一个字符看看是够能获取到应用权限。

    展开全文
  • 之前一直没发现,直到这次小米应用商店上线的时候被打回,网上百度了一下才知道小米手机还有一个这么大的坑!... 由于小米android系统的修改,导致部分小米6.0以上系统手机,在动态获取权限的时候失败
  • 其他机型可以,小米手机下载失败,提示读写权限不足。然后发现小米需要读写权限都有,和权限组的理论相悖,所以要做如下处理 ActivityCompat.requestPermissions(this, new String[]{ Manifest.permission.READ_...
  • 1.小米MIUI有个通知类短信权限,这个权限不知道如何申请,不知道如何判断是否具有该权限; 2.业务要求在引导页弹短信读取权限的弹窗让用户授权(这个是其他手机正常的流程),小米MIUI读取短信权限READ_SMS,动态...
  • 事实上自android6.0以来,这个检查权限一直很让人头痛。之所以提到让人头痛,是因为并不是所有厂商都按照规矩来,比如小米,无论是否拒绝:ContextCompat.checkSelfPermission()使用这个方法获取的结果始终为通过。...
  • 各位清楚,android设备有Root超级权限,一旦手机开启root相关权限,能够实现更多的功能,举个例子各位企业的营销部门同事,使用较多营销应用都需要在Root超级权限下工作,如果手机无能获的root的权限,则不能正常...
  • 最近在项目中发现需要做Android权限检查,要不然会在某些机型上失败。 API23以上的版本有提供好权限申请,具体参考API:https://developer.android.com/guide/topics/security/permissions.html 或者...
  • Android权限设置引导

    2018-05-19 19:02:54
    Android中当我们需要的权限被禁用时,需要引导用户去开启该权限(一般是跳转到权限设置页面),这样可以达到优化用户体验的效果。 我们知道Android 6.0之后对于部分敏感权限,如电话、短信、SD和相机等需要进行...
  • 做开发的人都清楚,Android设备有Root权限,如果手机启用了root相关权限,就能够实现更完美的功能,举例子,做开发的人企业的营销部门的妹纸,使用较多营销软件都需要在Root权限下使用,如果手机没办法获的root的...
  • 但是在小米手机上无法定位,检查没有任何错误,最后通过搜索才知道是Android6.0的问题,这是因为在Android6.0采用了运行时权限(RuntimePermissions),Android6.0的权限一般分为两种,一种时普通权限,可以直接获取...
  • 最近一个项目遇到一个很奇葩的权限问题,8.0版本以上有个新功能就是在manifest里面注册权限只要注册一个权限组里面的其中一个,其他的...比如oppo,比如vivo,我的测试机是小米是ok的,华为上面也是ok的,但是oppo、...
  • 各位都知道,android系统有root权限,如果手机启用了root相关权限,可以实现更完美的功能,举个栗子各位公司的营销部门的妹子,使用某些营销应用都需要在root权限下执行,如果手机无能获的root的权限,即没办法正常...
  • 注明:已在AndroidMainFest中声明网络权限和位置权限。![图片说明](https://img-ask.csdn.net/upload/201701/24/1485228550_667497.png) package com.example.school_pet; import java.util.List; import android....
  • 经初步选型,最终决定接入百度定位,按照百度定位SDK Android文档,接入过程相对顺利。 但随后发现,在小米系列等部分机型上,进入app后会出现"正在尝试 通过网络或者卫星对您的手机进行定位"。 很影响用户体验。 ...
  • 随着Android 版本的更新,获取手机序列号的方式也有所不同。最近咋工作中看到了,查阅资料在这里总结下。 1、获取序列号 public String getSerialNumber() { String serialNumber = "unKnown"; if (Build.VERSION...
  • 看了一些资料说设置权限,实际上大多是说下面那条语句没有添加,但是我是添加了的,然后一直想不到怎么破,后来去上个厕所,灵感一来,直接真机设置权限!!! File root = new File(Environment....
1 2 3 4 5 ... 20
收藏数 1,688
精华内容 675