1. 程式人生 > >Android 7.0及以上系統訪問相機問題詳解

Android 7.0及以上系統訪問相機問題詳解

本章節講述Android 7.0及以上獲取相機問題

1.清單檔案

2.專案配置

3.程式碼

/**
     * Android 6.0系統及以上申請敏感許可權方法
     * */

    private void requestAndroidPermission(){
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){//6.0
            boolean has= AndroidPermissionUtils.hasAndroidPermission(InformationActivity.this, DataConstant.permission);
            if(!has){//6.0及以上 沒有許可權
                AndroidPermissionUtils.requestAndroidPermission(InformationActivity.this,0,DataConstant.permission);
            }else{//6.0及以上 有許可權
                getUserPopupWindowInstance();
                userimg_ppw.showAtLocation(this.findViewById(R.id.activity_information_fatherlayout), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0,0);
            }
        }else{//6.0以下
            getUserPopupWindowInstance();
            userimg_ppw.showAtLocation(this.findViewById(R.id.activity_information_fatherlayout), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0,0);
        }
    }

    /**
     * onRequestPermissionsResult 動態申請回調方法
     * */

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(grantResults.length > 0 && !(grantResults[0] == PackageManager.PERMISSION_GRANTED)){
            showPermissionDialogs(StringConstant.errorstate6);
        }
    }

    /**
     * 許可權相關操作顯示對話方塊
     */

    public void showPermissionDialogs(final String msg) {
        if(!ActivityUtils.isActivityIsAlive(this)){
            return;
        }
        showPermissionalertDialog=new AlertDialog.Builder(InformationActivity.this).create();
        showPermissionalertDialog.show();
        showPermissionalertDialog.setCancelable(false);//點選外部 對話方塊不消失
        Window window=showPermissionalertDialog.getWindow();
        window.setContentView(R.layout.dialog_informations);
        TextView titletv= (TextView) window.findViewById(R.id.dialog_informations_titletv);
        titletv.setText("許可權設定");
        //顯示內容
        TextView contexttv = (TextView) window.findViewById(R.id.dialog_informations_contexttv);
        contexttv.setText(msg);
        //確定
        TextView suretv=(TextView) window.findViewById(R.id.dialog_informations_surelv);
        suretv.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                showPermissionalertDialog.dismiss();
            }
        });
    }


/**
     * 各種點選事件的方法
     * */

    @Override
    public void onClick(View v) {
        switch(v.getId()){
            case R.id.apptoplayout_onlyback_backlayout://返回
                backPPW();
                break;
            case R.id.activity_information_usertextview://修改個人資訊 登入賬號
                goEditorInformationActivity();
                break;
            case R.id.activity_information_nametextview://修改個人資訊 姓名
                goEditorInformationActivity();
                break;
            case R.id.activity_information_gendertextview://修改個人資訊 性別
                goEditorInformationActivity();
                break;
            case R.id.activity_information_phonetextview://修改個人資訊 手機號
                goEditorInformationActivity();
                break;
            case R.id.activity_information_positiontextview://修改個人資訊 職稱
                goEditorInformationActivity();
                break;
            case R.id.activity_information_emailtextview://修改個人資訊郵箱
                goEditorInformationActivity();
                break;
            case R.id.activity_information_instructiontextview://修改個人資訊 簡介
                goEditorInformationActivity();
                break;
            case R.id.activity_information_avalayout://上傳頭像
                requestAndroidPermission();//Android 6.0系統及以上申請敏感許可權方法
                break;
            case R.id.userimagepopuview_localbtn://頭像來源  手機相簿
                selectImageFromLocal();
                dismissPpw();
                break;
            case R.id.userimagepopuview_camerabtn://頭像來源  相機拍照
                takePhoto();
                dismissPpw();
                break;
            case R.id.userimagepopuview_cancalbtn://取消
                dismissPpw();
                break;
        }
    }



/**
     *手機拍照
     * */

    public void takePhoto(){
        if(FileHelper.isSdCardExist()){
            Uri photoURI=null;
            String name=String.valueOf(System.currentTimeMillis());
            mPath=FileHelper.createAvatarPathPicture(name);
            Intent takePictureIntent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if(takePictureIntent.resolveActivity(getPackageManager())!=null){
                //建立一個File
               File photoFile = new File(mPath);
                if(photoFile != null){
                    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
                        //如果是7.0及以上的系統使用FileProvider的方式建立一個Uri
                        photoURI=FileProvider.getUriForFile(InformationActivity.this, "com.dchealth.doctor.Clinicians.fileprovider", photoFile);
                        takePictureIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                        takePictureIntent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                    } else {
                        //7.0以下使用這種方式建立一個Uri
                        photoURI = Uri.fromFile(photoFile);
                    }
                    //將Uri傳遞給系統相機
                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                    startActivityForResult(takePictureIntent, StringConstant.REQUEST_CODE_TAKE_PHOTO);
                }
            }
        }else{
            toast.showToast(StringConstant.Filestatus2);
        }
    }

    /**
     * 手機相簿
     * */

    public void selectImageFromLocal(){
        if(FileHelper.isSdCardExist()){
            Intent intent;
            if(Build.VERSION.SDK_INT<19){
                intent=new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("image/*");
            }else{
                intent=new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            }
            startActivityForResult(intent, StringConstant.REQUEST_CODE_SELECT_PICTURE);
        }else{
            toast.showToast(StringConstant.Filestatus2);
        }
    }

    /**
     * 複製後裁剪檔案
     * @param file 要複製的檔案
     */

    private void copyAndCrop(final File file) {
        FileHelper.getInstance().copyAndCropPicture(file, this, new FileHelper.CopyFileCallback() {
            @Override
            public void copyCallback(Uri uri) {
                mUri=uri;
                Intent intent=new Intent();
                intent.putExtra("filePath", mUri.getPath());
                intent.setClass(InformationActivity.this, CropImageActivity.class);
                startActivityForResult(intent, StringConstant.REQUEST_CODE_CROP_PICTURE);
            }
        });
    }