首页手机targets. targetsdk应用介绍

targets. targetsdk应用介绍

圆圆2025-07-12 10:00:44次浏览条评论

大家好,又见面了,我是你们的朋友全栈君。

今天我们来讨论一下在Android 7.0及以上版本中,如何解决相机和摄像头在严格模式下的问题。以下详细的是解决方案和配置步骤。

官方推荐-FileProvider

1. 缘由(转载)

从Android 7.0(N)开始,系统会严格执行StrictMode模式,这意味着安全性需要进行更严格的检查。来自Android N开始,不允许在应用间使用file://的方式提交文件,否则会抛出FileUriExposedException错误,直接导致应用崩溃。

不过,官方提供了解决方案,即使用FileProvider,通过content://模式替换file://,需要开发者将targetSdkVersion升级到24及以上才会执行此策略。

2. 配置FileProvider

2.1 AndroidManifest内配置FileProvider

注意:provider是Android四大组件,需要放置在application标签内之一。

lt;provider android:authorities=quot;${applicationId}.fileproviderquot; android:exported=quot;falsequot; android:grantUriPermissions=quot;truequot; android:name=quot;android.support.v4.content.FileProviderquot;gt; lt;元数据 android:name=quot;android.support.FILE_PROVIDER_PATHSquot; android:resource=quot;@xml/installquot;/gt;lt;/providergt;登录后复制

2.2可访问路径配置

路径配置的位置在install.xml文件中:lt;?xml version=quot;1.0quot;encoding=quot;utf-8quot;?gt;lt;paths xmlns:android=quot;http://schemas.android.com/apk/res/androidquot;gt;gt; lt;外部路径名称=“;DCIM”;路径=“DCIM/camerademo”;/gt; lt;外部路径名称=“external_storage_root”; 路径=“.”;/gt; lt;外部路径名称=“Pictures”; 路径=“Pictures/camerademo”;/gt; lt;文件路径名称=“private_files”; 路径=“images”;/gt; lt;缓存路径名称=“private_cache”; 路径=“images”;/gt; lt;外部文件路径名称=“external_files”; 路径=“Pictures”;/gt; lt;外部缓存路径名称=“external_cache”; path=quot;.quot;/gt;lt;/pathsgt;登录后复制

分析路径的用途

当调用Environment.getExternalStorageDirectory()获取外部存储根目录时,获取的路径是/storage/emulated/0。

例如,在代码中使用photoUri = FileProvider.getUriForFile(this, getPackageName() ".fileprovider", takeImageFile);时,photoUri的值可能是:content://com.yoshin.company.blogdemo.fileprovider/external_storage_root/DCIM/camera/IMG_20200526_203123.jpg登录后复制

此时,存储外部根目录在Uri中显示为“external_storage_root”。

其他路径配置的标签参照FileProvider里面的TAG配置

targetSdk27 FileProvider 摄像和照相[通俗易懂]

3. 访问 FileProvider

调用相机代码可以如下修改:public void takePicture(Activity activity, int requestCode) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_ACTIVITY_CLEAR_TOP); if (existSDCard()) { takeImageFile = new File(Environment.getExternalStorageDirectory(), quot;/DCIM/camera/quot;); } else { takeImageFile = Environment.getDataDirectory(); } takeImageFile = createFile(takeImageFile, quot;IMG_quot;, quot;.jpgquot;); photoUri = FileProvider.getUriForFile(this, getPackageName() quot;.fileproviderquot;, takeImageFile);intent.putExtra(MediaStore.EXTRA_OUTPUT,photoUri);activity.startActivityForResult(intent,requestCode);}登录后复制

4. 拓展:获取图片方式

4.1通过绝对路径获取图片image.setImageBitmap(BitmapFactory.decodeFile(takeImageFile.getAbsolutePath()));登录后复制

4.2通过Uri获取资源流Bitmap bitmap = null;try { bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(photoUri));} catch (FileNotFoundException e) { e.printStackTrace();}image2.setImageBitmap(bitmap);登录后复制

4.3通过游标获取图片

这是一个错误示范,具体参考:Cursorcursor = getContentResolver().query(photoUri, new String[]{MediaStore.Images.Media.DATA}, null, null, null);if (cursor != null) { if (cursor

.getColumnCount() gt; 0) { if (cursor.moveToFirst()) { int index =cursor.getColumnIndex(MediaStore.Images.Media.DATA); if (index gt;-1) { path =cursor.getString(index); } else { LogUtils.e(TAG, quot;光标索引 -1quot;); } } } cursor.close();}登录后复制

通过Uri和selection来获取真实路径的方法在Android系统中是可行的,但是由于我们的Uri不是目标文件的绝对路径,查询不到任何信息。

尝试自己切割Uri来也没有:Uri uri = new Uri.Builder() .scheme(quot;contentquot;查询) .authority(BuildConfig.APPLICATION_ID quot;.fileproviderquot;) .path(quot;/DCIM/camerademo/IMG_20200527_093044.jpgquot;) .build();登录后复制

打印出的Uri为:uri ===内容://com.yoshin.company.blogdemo.fileprovider/DCIM/camerademo/IMG_20200527_093044.jpg登录后复制

替换photoUri去查询,仍然找不到任何信息。

严格模式解决方法

项目中的解决方法是在查询onCreate时添加如下代码:// android 7.0系统解决方案的问题StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();StrictMode.setVmPolicy(builder.build());builder.detectFileUriExposure();登录后复制

虽然官方不推荐这种方法,但即存在合理。

摄像通过bebug代码,休也可以这么搞private void takeVedio() { // 表示跳转至相机的录视频界面 Intentintent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); // MediaStore.EXTRA_VIDEO_QUALITY 表示录制视频的质量,从0-1,越大表示质量顺利,同时视频也越大intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 30); //调用前置摄像头intent.putExtra(quot;android.intent.extras.CAMERA_FACINGquot;, 1);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); if (intent.resolveActivity(getPackageManager()) != null) { File file; if (existSDCard()) { 文件 = 新File(Environment.getExternalStorageDirectory(), quot;/DCIM/audio/quot;); } else { file = Environment.getDataDirectory(); } Log.i(TAG, quot;file ===quot; file); file = createFile(file, quot;VIDEO_quot;, quot;.mp4quot;); Log.i(TAG, quot;file ===quot; file); if (file != null) { Uri uri = Uri.parse(quot;file://quot; file.getAbsolutePath()); Log.i(TAG, quot;uri ===quot; uri);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); } } startActivityForResult(intent, REQUEST_CODE_RECORD_VIDEO);}登录后复制

总结

通过使用FileProvider,可以有效解决Android 7.0及以上版本中相机和摄像头在严格模式下的问题。希望本文对您有所帮助,欢迎大神留言指正。

推荐Github开源项目SelectImgAsWechath:https://www.php.cn/link/cd9015a609618aa8dcd0a7ff7941c475

参考地址:Android FileProvider详细解析和足迹指南

发布者:全栈程序员栈长,休闲请裸体出处:https://www.php.cn/link/d0241607c7a6d2011c767cfb3 5b8248d

原文链接:https://www.php.cn/link/c8377ad2a50fb65de28b11cfc628d75c

以上就是targetSdk27 FileProvider网络和拍照[通俗易懂]的详细内容,更多请关注乐哥常识网其他相关文章!

targetSdk2
简述hive的安装步骤 hive安装配置实验总结
相关内容
发表评论

游客 回复需填写必要信息