日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android开发之在Fragment和Activity页面拍照需要注意的地方

發(fā)布時(shí)間:2023/12/15 Android 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android开发之在Fragment和Activity页面拍照需要注意的地方 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

先貼出Google官方文檔:Google官方拍照文檔

感覺講的不是很細(xì),有不少坑。

先看需要配置權(quán)限和provider

<!--拍照存儲(chǔ)權(quán)限--><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"tools:ignore="ScopedStorage" /><!--拍照權(quán)限--><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><!-- 配置拍照?qǐng)D片存儲(chǔ)路徑為: 包名/files/Pictures--><external-pathname="my_images"path="Android/data/cn.xiayiye5.xiayiye5library/files/Pictures" /> </paths>

當(dāng)然還有一個(gè)萬(wàn)能路徑寫法待研究:感謝此博主:萬(wàn)能路徑寫法

<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> ———————————————— 版權(quán)聲明:本文為CSDN博主「Huc_Boy」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/liu_xueping/article/details/103980700

好了activity頁(yè)面開始拍照了

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 {//提示用戶開戶權(quán)限 拍照和讀寫sd卡權(quán)限String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};ActivityCompat.requestPermissions(activity, perms, 10010);}}

再看下activity頁(yè)面回調(diào)

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {//拍照后的圖片回調(diào)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;//設(shè)置縮放比例newOpts.inSampleSize = size * 2;Log.e("打印縮放比例", size + "");//重新讀入圖片,注意此時(shí)已經(jīng)把options.inJustDecodeBounds 設(shè)回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) {//權(quán)限申請(qǐng)成功Toast.makeText(this, "activity頁(yè)面權(quán)限申請(qǐng)成功!", Toast.LENGTH_LONG).show();// 調(diào)用拍照方法TakePhotoUtils.getInstance().dispatchTakePictureIntent(this);} else {//用戶授權(quán)拒絕之后,友情提示一下就可以了Toast.makeText(this, "activity頁(yè)面請(qǐng)開啟應(yīng)用拍照權(quán)限!", Toast.LENGTH_LONG).show();}}super.onRequestPermissionsResult(requestCode, permissions, grantResults);}

再看下在fragment中拍照只需要注意兩點(diǎn)

看下在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頁(yè)面拍照需要使用fragment中的startActivityForResult,不然不會(huì)走fragment中的回調(diào)fragment.startActivityForResult(takePictureIntent, TakePhotoActivity.REQUEST_IMAGE_CAPTURE);}}} else {//提示用戶開戶權(quán)限 拍照和讀寫sd卡權(quán)限String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};//在fragment中申請(qǐng)權(quán)限時(shí)候需要使用fragment中的requestPermissions方法不然不會(huì)走fragment中的回調(diào)fragment.requestPermissions(perms, 10010);}}

再看下在fragment中的回調(diào)

@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中拍照后的回調(diào)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;//設(shè)置縮放比例newOpts.inSampleSize = size * 2;Log.e("打印縮放比例", size + "");//重新讀入圖片,注意此時(shí)已經(jīng)把options.inJustDecodeBounds 設(shè)回false了Bitmap bitmap = BitmapFactory.decodeFile(TakePhotoUtils.getInstance().getImgPath(), newOpts);ivTakePhoto.setImageBitmap(bitmap);}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {//在fragment中申請(qǐng)權(quán)限后的回調(diào)if (requestCode == 10010) {boolean cameraAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;if (cameraAccepted) {//權(quán)限申請(qǐng)成功Toast.makeText(requireActivity(), "fragment頁(yè)面權(quán)限申請(qǐng)成功!", Toast.LENGTH_LONG).show();// 調(diào)用拍照方法TakePhotoUtils.getInstance().dispatchTakePictureIntent(this);} else {//用戶授權(quán)拒絕之后,友情提示一下就可以了Toast.makeText(requireActivity(), "fragment頁(yè)面請(qǐng)開啟應(yīng)用拍照權(quán)限!", Toast.LENGTH_LONG).show();}}super.onRequestPermissionsResult(requestCode, permissions, grantResults);}

Activity拍照源碼:activity拍照

Fragment拍照源碼:fragment拍照

拍照工具類源碼:拍照工具類

總結(jié)

以上是生活随笔為你收集整理的Android开发之在Fragment和Activity页面拍照需要注意的地方的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。