标签: android-fileprovider

将内容 URI 与 ACTION_VIDEO_CAPTURE 结合使用

我目前在我的文件提供程序上使用内容 URI 来检索ACTION_IMAGE_CAPTURE意图返回的相机图像。这工作正常。

出于某种奇怪的原因,尝试从相机检索视频文件时,相同的调用不起作用。

        destinationFile = File.createTempFile("video", ".mp4", this.getFilesDir());
        Uri uri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", destinationFile);

        Intent cameraIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        cameraIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
        cameraIntent.setClipData(ClipData.newRawUri(null, uri));
        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        startActivityForResult(cameraIntent, ID);
Run Code Online (Sandbox Code Playgroud)

当目的返回时onActivityResult(),destinationFile 为空。

简单地替换MediaStore.ACTION_VIDEO_CAPTUREMediaStore.ACTION_IMAGE_CAPTURE给我预期的行为:所拍摄的图像保存在destinationFile。

这发生在 Nexus 设备和默认的 Google 相机应用程序上的库存 Android 6.0.1 上。

视频捕获真的不支持内容 URI 吗?我宁愿不在可公开访问的目录中使用文件 URI。

camera android video-capture mediastore android-fileprovider

5
推荐指数
1
解决办法
1183
查看次数

PackageManager#installPackage 不适用于 Android N

当使用构建工具版本 24 和带有 N 图像 (npd56n) 的 Android 设备时,我无法使用 PackageManager#installPackage 安装包。

当带有file:方案的URI传递给方法时,返回 -3,我假设它是INSTALL_FAILED_INVALID_URI

当使用 FileProvider( content:scheme)创建的 URI传递给方法时,抛出异常:

Caused by: java.lang.UnsupportedOperationException: Only file:// URIs are supported                                                                    
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

android android-package-managers android-fileprovider android-7.0-nougat

5
推荐指数
1
解决办法
867
查看次数

由于未找到FileProvider Class,因此在重新安装模拟器后应用程序崩溃

当我在模拟器上运行应用程序时,它总是在第一次尝试时工作.但是,当应用程序已经安装在模拟器上时,它通常会在应用程序启动时导致崩溃.Android Studio 2.0开始出现此问题.它不会出现在设备上,因此它不是那么重要但只是烦人,因为我总是需要在安装新版本之前从模拟器中删除应用程序.

由于我完全不知道导致这个问题的原因并且在研究过程中找不到类似的问题,我希望有人可以帮助我.

错误信息:

08-25 09:55:35.023 4214-4214/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.mls.Search.Abbott, PID: 4214
    java.lang.RuntimeException: Unable to get provider android.support.v4.content.FileProvider: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.content.FileProvider" on path: DexPathList[[zip file "/data/app/com.mls.Search.Abbott-2/base.apk"],nativeLibraryDirectories=[/data/app/com.mls.Search.Abbott-2/lib/x86, /data/app/com.mls.Search.Abbott-2/base.apk!/lib/x86, /vendor/lib, /system/lib]]
        at android.app.ActivityThread.installProvider(ActivityThread.java:5156)
        at android.app.ActivityThread.installContentProviders(ActivityThread.java:4748)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4688)
        at android.app.ActivityThread.-wrap1(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5417)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.content.FileProvider" on path: DexPathList[[zip file "/data/app/com.mls.Search.Abbott-2/base.apk"],nativeLibraryDirectories=[/data/app/com.mls.Search.Abbott-2/lib/x86, /data/app/com.mls.Search.Abbott-2/base.apk!/lib/x86, /vendor/lib, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
        at …
Run Code Online (Sandbox Code Playgroud)

android android-emulator android-studio android-fileprovider

5
推荐指数
1
解决办法
3123
查看次数

FileProvider.getUriForFile 与 Uri.fromFile - 除了权限之外还有其他区别吗

在我的 Andoroid 应用程序中,我想让用户使用用户喜欢的任何发送方法(例如电子邮件、Skype、Viber、蓝牙等)发送我的应用程序生成的文件,我正在使用 Intent.ACTION_SEND,如下所示:

File readF = new File(fullFileName);
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, getResources().getString(R.string.some_subject));
intent.putExtra(Intent.EXTRA_TEXT, getResources().getString(R.string.some_message_body));
Uri uri = FileProvider.getUriForFile(this, "my.package.fileprovider", readF);
intent.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(intent, getResources().getString(R.string.some_info_message));
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,它成功地通过 Gmail 和蓝牙发送文件。

但是当用户选择Skype 时,文件被发送,但它的名字被改变了

当用户选择Viber 时,不会发送任何内容。

如果我只改变构建 Uri 的方式:

Uri uri = Uri.fromFile(new File("/some/publicly/available/file"));
Run Code Online (Sandbox Code Playgroud)

然后该文件通过 Skype 和 Viber 成功发送,并保留名称。

那么在 Intent 中使用 FileProvider 与直接使用公共文件有什么区别。

android uri android-fileprovider

5
推荐指数
1
解决办法
1492
查看次数

Android 7 nougat,如何从传入意图的uri获取文件路径?

FileProvider: - 设置文件共享

我知道在android nougat中更改文件策略.文件共享到其他应用程序的通缉应用程序通过FileProvider生成uri.uri格式是content://com.example.myapp.fileprovider/myimages/default_image.jpg.

我想知道如何从生成的uri获取filepath FileProvider.getUriForFile().因为我的app需要知道物理文件路径才能保存,加载,读取信息等,这是可能的

[简而言之]

  1. 我的应用程序在andorid 7 nougat上收到了其他应用程序的意图uri.
  2. uri格式是 content://com.example.myapp.fileprovider/myimages/default_image.jpg
  3. 也许是由它产生的FileProvider.getUriForFile.
  4. 我想知道从uri获取文件路径的方法.
  5. 我可以从中获取mime类型,显示名称,文件大小和读取binay getContentResolver().openFileDescriptor().但我想知道文件路径.

android filepath android-intent android-fileprovider android-7.0-nougat

5
推荐指数
1
解决办法
5899
查看次数

android库项目中的FileProvider权限

在一个库项目中,我使用FileProvider并将我的库 applicationId 作为其权限。现在,当有人在他的应用程序的两种版本中使用这个库时,由于 FileProvider 冲突,第二个版本将无法安装。

目标

能够为应用程序的每个变体为我的库 FileProvider 定义唯一的权限。

第一种方法

我向权限附加了一个随机整数,效果很好。

构建.gradle

static def generateContentProviderAuthority() {
    Random random = new Random()
    return new StringBuilder()
            .append("application.id.of.my.library")
            .append(".fileprovider")
            .append(String.valueOf(random.nextInt(100000)))
            .toString()
}


defaultConfig {
    ...
    manifestPlaceholders= [contentProviderAuthority: generateContentProviderAuthority()]
}
Run Code Online (Sandbox Code Playgroud)

显现

<provider
    android:name=".helper.FileProvider"
    android:authorities="${contentProviderAuthority}"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/filepaths"/>
</provider>
Run Code Online (Sandbox Code Playgroud)

但是现在清单更改了每个构建,这与即时运行和其他东西混在一起......

解决方案

是否可以在我的库 build.gradle 中获取使用该库的应用程序的确切 applicationId?

android android-manifest android-library android-fileprovider

5
推荐指数
1
解决办法
2423
查看次数

通过意图拒绝文件提供程序的权限

我正在尝试将位图从我的应用程序的缓存目录发送到短信应用程序。我正在使用文件提供程序向处理意图的应用程序授予临时权限。当我尝试发送意图并从意图选择器中选择默认的 android 短信应用程序时,我的消息应用程序崩溃并出现此错误。我尝试从意图选择器中选择其他应用程序,例如电子邮件和其他消息传递应用程序,它似乎工作正常,只是在使用默认文本消息传递应用程序时崩溃。

java.lang.SecurityException: Permission Denial: reading android.support.v4.content.FileProvider uri content://com.example.brandon.emojimms2/shared_images/image.png from pid=9804, uid=10024 requires the provider be exported, or grantUriPermission()
Run Code Online (Sandbox Code Playgroud)

权限拒绝 这是我分享意图的代码

private void shareImage()
{
    File imagePath = new File(mContext.getCacheDir(), "images");
    File newFile = new File(imagePath, "image.png");
    Uri contentUri = FileProvider.getUriForFile(mContext, "com.example.brandon.emojimms2", newFile);

    if (contentUri != null) {
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // temp permission for receiving app to read this file
        shareIntent.setDataAndType(contentUri, mContext.getContentResolver().getType(contentUri));
        shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
        startActivity(Intent.createChooser(shareIntent, "Choose an app"));
    }
}
Run Code Online (Sandbox Code Playgroud)

我相当确定我正确设置了文件提供程序,但这里是清单,以防万一。 在此处输入图片说明

编辑:我刚刚做了一些测试,似乎短信应用程序崩溃发生在早期 api 的手机上,但正在处理新的 api,例如 …

android android-intent android-contentprovider android-permissions android-fileprovider

5
推荐指数
1
解决办法
4126
查看次数

将 Firebase 和 FileProvider 与构建变体结合使用

我正在使用 Firebase 的构建变体,我的应用程序还需要使用 FileProvider 来共享要在 3rd 方应用程序中打开的应用程序文件。但是,当我尝试在 Intent 中发送 URI 时,应用程序崩溃并出现以下错误。

error:java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.example.debug/files/Pictures/JPEG_20170919_113955_102027655.jpg

这是我的配置 String authority = getString(R.string.authority_provider); Uri fileUri = FileProvider.getUriForFile(context, authority, file);

  • 将文件提供程序添加到 AndroidManifest.xml 中的应用程序标签内:

    <provider android:name="android.support.v4.content.FileProvider" android:authorities="@string/authority_provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>

  • file_paths.xml

    <?xml version="1.0" encoding="utf-8"?> <paths> <external-path name="my_images" path="Android/data/${applicationId}/files/Pictures" /> <external-file-path name="my_images" path="Android/data/${applicationId}/files/Pictures" /> </paths>

由于Firebase要求使用 2 个应用程序 ID 来保存崩溃日志,Firebase 控制台中的分析是分开的

  • 字符串:authority_provider - 添加到 build.gradle(app) 中:

    buildTypes { release { --- applicationIdSuffix "com.example" resValue "string", …

android firebase android-fileprovider

5
推荐指数
0
解决办法
780
查看次数

Android Fileprovider:无法找到包含的配置根目录

我创建了一个应用程序,用于创建 gpx 文件。除了共享之外,一切正常。因此我创建了一个文件提供程序。您可以在下面看到它的配置。Provider 在我运行 Android 8.0.0 的 android 设备上运行良好,但在朋友 Huawei (6.0) 上它不工作

Fatal Exception: java.lang.IllegalArgumentException
Failed to find configured root that contains /storage/8737-15E4/Android/data/XXX/cache/20171009_171900.gpx
Run Code Online (Sandbox Code Playgroud)

清单中的提供者:

<provider
        android:name=".GenericFileProvider"
        android:authorities="com.package.test.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>
Run Code Online (Sandbox Code Playgroud)

文件路径.xml:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path name="external-files" path="/" />
<external-cache-path name="cache-files" path="/" />
</paths>
Run Code Online (Sandbox Code Playgroud)

代码中的用法:

File gpxFile = new File(context.getExternalCacheDir(), "20171009_171900.gpx");    
Uri gpxContentUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", gpxFile);

        Intent gpxIntent = new Intent(Intent.ACTION_SEND);
        gpxIntent.setType("text/gpx");

        gpxIntent.putExtra(Intent.EXTRA_STREAM, gpxContentUri);

        Intent programChooser = Intent.createChooser(gpxIntent, context.getString(R.string.select_app_to_share));
        programChooser.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

        activityForDialog.startActivity(programChooser);
Run Code Online (Sandbox Code Playgroud)

我希望有人能帮我找到导致应用程序在某些设备上崩溃的错误...

android android-fileprovider

5
推荐指数
1
解决办法
2384
查看次数

如何从Android Oreo(8.1)或更高版本中的URI获取文件路径

预期的行为

当我选择存储在"下载"中的文件时,它应该能够检索其文件名和路径

实际行为

当我选择存储在"下载"中的文件时,它返回null.

重现问题的步骤

  1. 调用pick文件方法时,它会在Android中显示文件夹
  2. 转到下载,选择一个文件
  3. 它从URI获取实际路径时返回null

这是我实现的代码

public static String getPath(final Context context, final Uri uri) {
   String id = DocumentsContract.getDocumentId(uri);
   if (!TextUtils.isEmpty(id)) {
      if (id.startsWith("raw:")) {
          return id.replaceFirst("raw:", "");
      }
      try {
         final boolean isOreo = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
         String stringContentURI;
         Uri contentUri;
         if(isOreo){ 
            stringContentURI = "content://downloads/my_downloads";
         }else{
            stringContentURI = "content://downloads/public_downloads";
         }
         contentUri = ContentUris.withAppendedId(
                    Uri.parse(stringContentURI), Long.valueOf(id));
         return getDataColumn(context, contentUri, null, null);
      } catch (NumberFormatException e) {
         return null;
      }
   }
}

public static String getDataColumn(Context context, …
Run Code Online (Sandbox Code Playgroud)

android uri android-contentresolver android-fileprovider android-8.1-oreo

5
推荐指数
1
解决办法
4751
查看次数