Android开发之在Fragment和Activity页面拍照需要注意的地方
生活随笔
收集整理的這篇文章主要介紹了
Android开发之在Fragment和Activity页面拍照需要注意的地方
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
先貼出Google官方文檔:Google官方拍照文檔
感覺講的不是很細,有不少坑。
先看需要配置權限和provider
<!--拍照存儲權限--><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"tools:ignore="ScopedStorage" /><!--拍照權限--><uses-permission android:name="android.permission.CAMERA" /> <!--拍照需要配置provider為了兼容Android 7.0 下面的authorities里面的值需要和拍照里面的provider一樣,下面這段代碼Uri photoUri = FileProvider.getUriForFile(activity, activity.getPackageName() + ".xiayiye5", photoFile);--><providerandroid:name="androidx.core.content.FileProvider"android:authorities="${applicationId}.xiayiye5"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths"></meta-data></provider>再看下file_path文件如何寫的
<?xml version="1.0" encoding="utf-8"?> <paths><!-- 配置拍照圖片存儲路徑為: 包名/files/Pictures--><external-pathname="my_images"path="Android/data/cn.xiayiye5.xiayiye5library/files/Pictures" /> </paths>當然還有一個萬能路徑寫法待研究:感謝此博主:萬能路徑寫法
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-pathname="external"path="." /><external-files-pathname="external_files"path="." /><cache-pathname="cache"path="." /><external-cache-pathname="external_cache"path="." /><files-pathname="files"path="." /> </paths> ———————————————— 版權聲明:本文為CSDN博主「Huc_Boy」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/liu_xueping/article/details/103980700好了activity頁面開始拍照了
public void dispatchTakePictureIntent(Activity activity) {if (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(activity, android.Manifest.permission.CAMERA)) {//拍照方法Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null) {File photoFile = null;try {photoFile = createImageFile(activity);} catch (IOException ex) {ex.printStackTrace();}if (photoFile != null) {Uri photoUri = FileProvider.getUriForFile(activity, activity.getPackageName() + ".xiayiye5", photoFile);takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);activity.startActivityForResult(takePictureIntent, TakePhotoActivity.REQUEST_IMAGE_CAPTURE);}}} else {//提示用戶開戶權限 拍照和讀寫sd卡權限String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};ActivityCompat.requestPermissions(activity, perms, 10010);}}再看下activity頁面回調
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {//拍照后的圖片回調DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);int screenWidth = dm.widthPixels;Bitmap decodeFile = BitmapFactory.decodeFile(TakePhotoUtils.getInstance().getImgPath());int width = decodeFile.getWidth();int size = width / screenWidth;BitmapFactory.Options newOpts = new BitmapFactory.Options();newOpts.inJustDecodeBounds = false;//設置縮放比例newOpts.inSampleSize = size * 2;Log.e("打印縮放比例", size + "");//重新讀入圖片,注意此時已經把options.inJustDecodeBounds 設回false了Bitmap bitmap = BitmapFactory.decodeFile(TakePhotoUtils.getInstance().getImgPath(), newOpts);ivTakePhoto.setImageBitmap(bitmap);}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {if (requestCode == 10010) {boolean cameraAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;if (cameraAccepted) {//權限申請成功Toast.makeText(this, "activity頁面權限申請成功!", Toast.LENGTH_LONG).show();// 調用拍照方法TakePhotoUtils.getInstance().dispatchTakePictureIntent(this);} else {//用戶授權拒絕之后,友情提示一下就可以了Toast.makeText(this, "activity頁面請開啟應用拍照權限!", Toast.LENGTH_LONG).show();}}super.onRequestPermissionsResult(requestCode, permissions, grantResults);}再看下在fragment中拍照只需要注意兩點
看下在fragment中拍照的方法
public void dispatchTakePictureIntent(Fragment fragment) {if (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(fragment.getContext(), android.Manifest.permission.CAMERA)) {//拍照方法Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);if (takePictureIntent.resolveActivity(fragment.requireActivity().getPackageManager()) != null) {File photoFile = null;try {photoFile = createImageFile(fragment.requireActivity());} catch (IOException ex) {ex.printStackTrace();}if (photoFile != null) {Uri photoUri = FileProvider.getUriForFile(fragment.requireActivity(), fragment.requireActivity().getPackageName() + ".xiayiye5", photoFile);takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);//在fragment頁面拍照需要使用fragment中的startActivityForResult,不然不會走fragment中的回調fragment.startActivityForResult(takePictureIntent, TakePhotoActivity.REQUEST_IMAGE_CAPTURE);}}} else {//提示用戶開戶權限 拍照和讀寫sd卡權限String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};//在fragment中申請權限時候需要使用fragment中的requestPermissions方法不然不會走fragment中的回調fragment.requestPermissions(perms, 10010);}}再看下在fragment中的回調
@Overridepublic void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { // super.onActivityResult(requestCode, resultCode, data);if (requestCode == TakePhotoActivity.REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {//在fragment中拍照后的回調DisplayMetrics dm = new DisplayMetrics();requireActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);int screenWidth = dm.widthPixels;Bitmap decodeFile = BitmapFactory.decodeFile(TakePhotoUtils.getInstance().getImgPath());int width = decodeFile.getWidth();int size = width / screenWidth;BitmapFactory.Options newOpts = new BitmapFactory.Options();newOpts.inJustDecodeBounds = false;//設置縮放比例newOpts.inSampleSize = size * 2;Log.e("打印縮放比例", size + "");//重新讀入圖片,注意此時已經把options.inJustDecodeBounds 設回false了Bitmap bitmap = BitmapFactory.decodeFile(TakePhotoUtils.getInstance().getImgPath(), newOpts);ivTakePhoto.setImageBitmap(bitmap);}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {//在fragment中申請權限后的回調if (requestCode == 10010) {boolean cameraAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;if (cameraAccepted) {//權限申請成功Toast.makeText(requireActivity(), "fragment頁面權限申請成功!", Toast.LENGTH_LONG).show();// 調用拍照方法TakePhotoUtils.getInstance().dispatchTakePictureIntent(this);} else {//用戶授權拒絕之后,友情提示一下就可以了Toast.makeText(requireActivity(), "fragment頁面請開啟應用拍照權限!", Toast.LENGTH_LONG).show();}}super.onRequestPermissionsResult(requestCode, permissions, grantResults);}Activity拍照源碼:activity拍照
Fragment拍照源碼:fragment拍照
拍照工具類源碼:拍照工具類
總結
以上是生活随笔為你收集整理的Android开发之在Fragment和Activity页面拍照需要注意的地方的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么创建自己的微信小程序
- 下一篇: Android开发之拍照后图片旋转的问题