android 6.0權限檢測以及6.0以下,麥克風、相機權限判斷

android 6.0以上權限

android 6.0以上權限,我是通過PermissionsDispatcher進行申請,操作的,具體使用方法,見PermissionsDispatcherAndroid 6.0運行時權限詳解

@RuntimePermissions
public class SplashActivity extends BaseCompatActivity
....

    @TargetApi(Build.VERSION_CODES.M)
    private void requestPermission()
    {
        //申請權限
        SplashActivityPermissionsDispatcher.doNeedsPermissionWithCheck(this);
    }
 //6.0權限控制

    @NeedsPermission({Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CALL_PHONE})
    void doNeedsPermission()
    {
        toLogin();
    }


    /**
     * 權限請求回調,提示用戶之後,用戶點擊“允許”或者“拒絕”之後調用此方法
     *
     * @param requestCode  定義的權限編碼
     * @param permissions  權限名稱
     * @param grantResults 允許/拒絕
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
    {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        SplashActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
    }

    @OnShowRationale({Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CALL_PHONE})
    void showRationale(PermissionRequest request)
    {
        request.proceed(); // 提示用戶權限使用的對話框
    }

    /**
     * 如果用戶拒絕該權限執行的方法
     */
    @OnPermissionDenied({Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CALL_PHONE})
    void onPermissionDenied()
    {
        toLogin();
    }

    @OnNeverAskAgain({Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CALL_PHONE})
    void onNeverAskAgain()
    {
        toLogin();
    }

6.0以下權限

6.0以下,檢測權限的方法,只要Manifest.xml有註冊這個權限,那麼就返回true在網上找了很多檢測權限的方法,最後證明都無效
現在把有效的方法說一下,SystemUtils類

判斷相機權限

  //Android6.0以下的攝像頭權限處理:
    public static boolean isCameraCanUse() {
        boolean canUse = true;
        Camera mCamera = null;
        try {
            mCamera = Camera.open();
            // setParameters 是針對魅族MX5 做的。MX5 通過Camera.open() 拿到的Camera
            Camera.Parameters mParameters = mCamera.getParameters();
            mCamera.setParameters(mParameters);
        } catch (Exception e) {
            canUse = false;
        }
        if (mCamera != null) {
            mCamera.release();
        }
        return canUse;
    }

判斷麥克風權限

  /**
     * 判斷是是否有錄音權限
     */
    public static boolean isHasPermission(final Context context)
    {
        // 音頻獲取源
        int audioSource = MediaRecorder.AudioSource.MIC;
        // 設置音頻採樣率,44100是目前的標準,但是某些設備仍然支持22050,16000,11025
        int sampleRateInHz = 44100;
        // 設置音頻的錄製的聲道CHANNEL_IN_STEREO爲雙聲道,CHANNEL_CONFIGURATION_MONO爲單聲道
        int channelConfig = AudioFormat.CHANNEL_IN_STEREO;
        // 音頻數據格式:PCM 16位每個樣本。保證設備支持。PCM 8位每個樣本。不一定能得到設備支持
        int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
        // 緩衝區字節大小
        int bufferSizeInBytes = 0;
        bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);

        AudioRecord audioRecord = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes);

        //開始錄製音頻
        try
        {
            // 防止某些手機崩潰
            audioRecord.startRecording();
        }
        catch (IllegalStateException e)
        {
            e.printStackTrace();
        }
        /**
         * 根據開始錄音判斷是否有錄音權限
         */
        if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING)
        {
            return false;
        }

        //根據錄音長度判斷
        byte[] bytes = new byte[1024];
        int readSize = audioRecord.read(bytes, 0, 1024); //至於爲什麼寫1024 我也不知道
        if (readSize == AudioRecord.ERROR_INVALID_OPERATION || readSize <= 0)
        {
            return false;
        }

        //如果短時間內頻繁檢測,會造成audioRecord還未銷燬完成,此時檢測會返回RECORDSTATE_STOPPED狀態,再去read,會讀到0的size,所以此時默認權限通過
        if (audioRecord.getRecordingState() == AudioRecord.RECORDSTATE_STOPPED)
        {
            return true;
        }

        audioRecord.stop();
        audioRecord.release();//釋放資源
        audioRecord = null;

        return true;

    }

電話權限,即使關閉了,還是能撥打電話,只能說通過try-catch嘗試進行判斷,如果不想這麼麻煩,可以使用不需要權限的撥打電話的方法

   Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_DIAL);
                    intent.setData(Uri.parse("tel:" + mobile));
                    context.startActivity(intent);

定位權限,關閉權限以後,還是可以定位,參照百度地圖,高德地圖,微信,qq,所以如果通過關閉定位權限,不讓app定位,這個恐怕不行,只有關閉gps或者網絡纔可以不讓定位

  /**
     * 手機是否開啓位置服務,如果沒有開啓那麼所有app將不能使用定位功能
     */
    public static boolean isLocServiceEnable(Activity context)
    {
        LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        if (gps || network)
        {
            return true;
        }
        return false;
    }

權限判斷使用

通過動態申請的方法,用戶可以關閉權限,或者點擊不再詢問,這樣在用到權限的操作的時候,可能會崩潰,這個要在操作之前,進行一些權限檢測,這個要分6.0以上和6.0以下的情況

  //6.0以上檢測某個權限是否已申請
    public static boolean checkPermission(Context mContexts, String permissionName)
    {
        PackageManager pm = mContexts.getPackageManager();
        boolean permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission(permissionName, getPackageInfo(mContexts).packageName));
        return permission;
    }

自定義一個dialog,作爲提示

  public static void showPermissionDialog(Activity activity, String info)
    {
        final NoticeDialog noticeDialog = new NoticeDialog(activity);
        noticeDialog.setTvSureContentVisible(true);
        noticeDialog.setBottomButtonLayoutVisible(false);
        noticeDialog.setNoticeContent(info + "權限已關閉,請您去手機設置中開啓。");
        noticeDialog.setSureButtonText("確定");
        noticeDialog.setSureListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                noticeDialog.dismiss();
            }
        });
        noticeDialog.showAtLocation(activity.getWindow().getDecorView(), Gravity.CENTER, 0, 0);

    }

封裝一個檢測是否有麥克風權限的方法

 public static boolean isHasRecordPermission(Activity activity)
    {
        boolean hasPermission = true;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        {
            if (!checkPermission(activity, "android.permission.RECORD_AUDIO"))
            {
                hasPermission = false;
            }
        }
        else
        {
            if (!isHasPermission(activity))
            {
                hasPermission = false;
            }
        }
        return hasPermission;
    }

使用方法:
相機權限

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                if(!SystemUtils.checkPermission(ChooseFamilyMemberActivity.this,"android.permission.CAMERA")
                                ){
                                    SystemUtils. showPermissionDialog(ChooseFamilyMemberActivity.this,"相機");
                                    return;
                                }
                            }else{
                                if (!SystemUtils.isCameraCanUse())
                                {//針對6.0以下
                                    SystemUtils. showPermissionDialog(ChooseFamilyMemberActivity.this,"相機");
                                    return;
                                }
                            }

定位權限

 if(!SystemUtils.checkPermission(context,"android.permission.ACCESS_FINE_LOCATION")
                ||!SystemUtils.checkPermission(context,"android.permission.ACCESS_COARSE_LOCATION")){
            SystemUtils.showPermissionDialog(context,"位置");
            return;
        }

        if(!SystemUtils.isLocServiceEnable(context)){
            final NoticeDialog noticeDialog = new NoticeDialog(context);
            noticeDialog.setTitleVisible(true);
            noticeDialog.setTitle("提示");
            noticeDialog.setNoticeContent("定位不可用,請打開gps或者網絡");
            noticeDialog.setBottomButtonLayoutVisible(false);
            noticeDialog.setTvSureContentVisible(true);
            noticeDialog.setSureButtonText("確定");
            noticeDialog.setSureListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    noticeDialog.dismiss();
                }
            });

            noticeDialog.showAtLocation(context.getWindow().getDecorView(), Gravity.CENTER, 0, 0);

            return;
        }

麥克風權限

  if (!SystemUtils.isHasRecordPermission(activity))
        {
            SystemUtils.showPermissionDialog(activity, "麥克風");
            return;

        }

參考資料
Android6.0權限機制(三):6.0以前國產手機權限處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章