Android 7.0及以上系統訪問相機問題詳解
阿新 • • 發佈:2019-01-04
本章節講述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); } }); }