(1)新建一个module
创建一个library
的module,在其AndroidManifest.xml中完成FileProvider的注册,代码编写为:
<application> <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.android7.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> </application>
注意一点,android:authorities
不要写死,因为该library最终可能会让多个项目引用,而android:authorities
是不可以重复的,如果两个app中定义了相同的,则后者无法安装到手机中(authority conflict)。
同样的的编写file_paths
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <root-path name="root" path="" /> <files-path name="files" path="" /> <cache-path name="cache" path="" /> <external-path name="external" path="" /> <external-files-path name="external_file_path" path="" /> <external-cache-path name="external_cache_path" path="" /> </paths>
最后再编写一个辅助类,例如:
public class FileProvider7 { public static Uri getUriForFile(Context context, File file) { Uri fileUri = null; if (Build.VERSION.SDK_INT >= 24) { fileUri = getUriForFile24(context, file); } else { fileUri = Uri.fromFile(file); } return fileUri; } public static Uri getUriForFile24(Context context, File file) { Uri fileUri = android.support.v4.content.FileProvider.getUriForFile(context, context.getPackageName() + ".android7.fileprovider", file); return fileUri; } public static void setIntentDataAndType(Context context, Intent intent, String type, File file, boolean writeAble) { if (Build.VERSION.SDK_INT >= 24) { intent.setDataAndType(getUriForFile(context, file), type); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); if (writeAble) { intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } } else { intent.setDataAndType(Uri.fromFile(file), type); } } }
可以根据自己的需求添加方法。
好了,这样我们的一个小库就写好了
(2)使用
如果哪个项目需要适配7.0,那么只需要这样引用这个库,然后只需要改动一行代码即可完成适配啦,例如:
拍照
public void takePhotoNoCompress(View view) { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getPackageManager()) != null) { String filename = new SimpleDateFormat("yyyyMMdd-HHmmss", Locale.CHINA) .format(new Date()) + ".png"; File file = new File(Environment.getExternalStorageDirectory(), filename); mCurrentPhotoPath = file.getAbsolutePath(); Uri fileUri = FileProvider7.getUriForFile(this, file); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); startActivityForResult(takePictureIntent, REQUEST_CODE_TAKE_PHOTO); } }
只需要改动: Uri fileUri = FileProvider7.getUriForFile(this, file);即可。
安装apk
FileProvider7.setIntentDataAndType(this, intent, "application/vnd.android.package-archive", file, true);即可。
https://github.com/hongyangAndroid/FitAndroid7
相关推荐
应用不再能直接访问外部存储(SD卡)上的所有文件,而是需要使用`FileProvider`来共享文件。`FileProvider`是一个特殊的`ContentProvider`,它允许安全地共享私有文件,而不会暴露文件路径。 2. **使用FileProvider...
标题中的"适用Android7.0的最新android-support-v4包"指的是该压缩包提供的`android-support-v4`库是针对Android 7.0 (Nougat)优化的,意味着它包含了所有与Android 7.0兼容的功能,并可能包括对新API的适配和性能...
- Android 7.0引入了`FileProvider`,以更安全的方式共享文件。在使用`Uri`进行文件操作时,必须通过`FileProvider`获取`content://`类型的`Uri`。 - `Intent`中使用`FLAG_GRANT_READ_URI_PERMISSION`和`FLAG_...
在Android 7.0及以上版本,由于采用了FileProvider来处理文件共享,我们需要创建一个`AndroidManifest.xml`中的`<provider>`标签来配置FileProvider,并在res/xml目录下创建一个`file_paths.xml`文件,定义可共享的...
`FileProvider` 是一个特殊的ContentProvider,用于安全地共享应用私有的文件,如照片、视频等。因此,当应用需要使用相机拍摄照片或从图库选取图片时,必须通过`FileProvider`获取一个安全的URI,以避免权限问题...
Android 7.0 行为变更之适配 File Provider 的方法 Android 7.0 行为变更之适配 ...Android 7.0 行为变更之适配 File Provider 的方法可以帮助开发者轻松地共享文件给其他应用程序,同时也提高了应用程序的安全性。
对于Android 7.0,我们需要特别处理文件 Uri 的安全问题,因为它引入了FileProvider来代替直接使用文件路径。以下是创建FileProvider的配置和获取Uri的步骤: 1. 在`AndroidManifest.xml`中添加`<provider>`标签,...
到了Android 7.0,系统对Intent的行为进行了调整,尤其是对于第三方应用的文件访问,引入了"FileProvider"来提供安全的文件共享。 下面,我们将逐步构建这个工具类: 1. **权限管理**: - 在`AndroidManifest.xml...
Android 7.0的相机适配主要涉及权限管理、FileProvider的使用以及对第三方应用相机访问的限制。下面我们将详细探讨这些关键点。 1. **权限管理**: 在Android 6.0(API级别23)开始,运行时权限模型被引入,这意味...
在Android开发中,`FileProvider`是Android API Level 14引入的一个非常重要的组件,主要用于在应用间安全地共享文件。由于Android 7.0(API Level 24)之后对权限管理的加强,传统的通过Uri共享文件的方式已经不再...
3. **使用FileProvider:** 对于简单的文件共享,Android提供了内置的`FileProvider`类,它是ContentProvider的一个子类,专门用于处理文件共享。只需在AndroidManifest.xml中声明FileProvider,并在需要的地方使用`...
总结来说,针对Android7.0的自动更新适配,开发者需要理解系统的新安全策略,并采取相应的措施,如使用`FileProvider`来处理文件共享,遵循严格的权限控制,从而确保应用在各个版本上的稳定运行。这个过程不仅解决了...
下面详细讲解如何使用`FileProvider`来适配Android 7.0以上的设备: 首先,我们需要检查设备的Android版本,如果大于等于Android 7.0,则使用`FileProvider`。这里是一个示例代码片段: ```java if (Build.VERSION...
针对Android 7.0的文件访问限制,我们需要使用`FileProvider`来共享文件URI。`FileProvider`是一个安全的`ContentProvider`子类,可以防止其他应用通过Intent访问私有文件。当设置`Intent.EXTRA_OUTPUT`时,应使用`...
在Android7.0及以上版本,为了安全起见,你需要添加FLAG_ACTIVITY_NEW_TASK和FLAG_GRANT_READ_URI_PERMISSION标志: ```java installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >...
- Android 7.0引入了FileProvider,用于安全地共享私有文件。开发者需要在AndroidManifest.xml中配置FileProvider,并使用`FileProvider.getUriForFile()`获取Uri,避免使用`file://` Uri,防止因安全问题导致应用...
在共享文件时,需要创建一个`FileProvider`并配置`<provider>`标签在`AndroidManifest.xml`中。 - `Uri`权限:当裁剪照片时,如果目标应用是Android 7.0或更高版本,需要在启动裁剪 Intent 时使用`...
- 安卓7.0引入了FileProvider以解决安全问题,我们需要创建一个`AndroidManifest.xml`中的`<provider>`标签来配置FileProvider,并在`res/xml`目录下创建`file_paths.xml`来指定可共享的文件路径。 4. **拍照并...
在Android 7.0中,文件访问更加强调安全,使用`FileProvider`可以安全地共享文件。 3. 第三方应用交互:在本例中,预览附件可能需要借助WPS等第三方应用。使用`Intent`是Android中启动其他应用的常见方式。开发者...
`FileProvider`是Android提供的安全方式来共享文件,特别是在Android 7.0及以上版本。然后,我们启动相机应用,并通过`EXTRA_OUTPUT`附加到Intent,这样相机应用就会将照片保存到指定的URI。 2. **启动相册**: ...