我有一个使用Universal Image Loader从互联网下载照片的应用程序,将它们缓存到data/data/com.myapp/cache并在ImageViews中显示.
我还想在我的应用程序中添加共享(WhatsApp,Facebook,Instagram,Dropbox等),所以我尝试使用这段代码:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM, photoUri);
intent.setType("image/jpeg");
startActivity(Intent.createChooser(intent, "Share image"));
Run Code Online (Sandbox Code Playgroud)
photoUri是缓存文件夹中的uri,其他应用程序无权阅读.
所以我google/stackoverflowed 发现我需要使用FileProvider.
我配置了FileProvider如下(如在这里写在我的清单):
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.myapp.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)
和file_paths.xml:
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<cache-path name="photo_cache" path="/"/>
</paths>
Run Code Online (Sandbox Code Playgroud)
然后我在按钮onClickListener的活动中使用以下代码:
File photoFile = ImageLoader.getInstance().getDiscCache().get("HTTP LINK HERE");
// returns File of "/data/data/com.myapp/cache/-1301123243"
Uri photoUri = FileProvider.getUriForFile(MyActivity.this, "com.myapp.fileprovider", photoFile);
// returns Uri of "content://com.myapp.fileprovider/photo_cache/-1301123243"
photoUri = Uri.parse(photoUri.toString() + ".jpg");
// then I add .jpg to file name
// Create …Run Code Online (Sandbox Code Playgroud) 遵循https://developer.android.com/training/secure-file-sharing/index.html并能够使用应用程序的内部目录(/data/data/package/files/xxx/)将文件共享到客户端应用程序文件提供者。
如何将资产文件夹(而不是内部目录)中的文件共享到客户端应用程序。
谢谢
我在使用FileProvider共享图像时遇到了Exception.以下是我以前的代码.
{
ArrayList<Uri> files = new ArrayList<Uri>();
files.add(getImageUriFromCache(context,bitmap,fileName));
}
private void startSharingIntent(ArrayList<Uri> files,String caption){
Intent i=new Intent(android.content.Intent.ACTION_SEND_MULTIPLE);
i.setType("image/png");
i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
i.putExtra(Intent.EXTRA_SUBJECT, "my app share");
i.putParcelableArrayListExtra(Intent.EXTRA_STREAM, files);
i.putExtra(Intent.EXTRA_TEXT,caption);
i.putExtra(Intent.EXTRA_TITLE,caption);
context.startActivity(Intent.createChooser(i, "Tital"));
}
public Uri getImageUriFromCache(Context inContext, Bitmap inImage , String fileId) throws IOException{
File cachePath = new File(inContext.getFilesDir() , "images/");
cachePath.mkdirs(); // don't forget to make the directory
File newFile = new File(cachePath, "im"+fileId+"_post.png");
newFile.setReadable(true, false);
FileOutputStream stream = new FileOutputStream(newFile); // overwrites this image every time
inImage.compress(Bitmap.CompressFormat.PNG, 100, stream);
stream.close();
Uri …Run Code Online (Sandbox Code Playgroud) android android-intent android-contentprovider android-sharing android-fileprovider
我正在使用FileProvider将我的内部文件暴露给Gallery.为了使它更加统一,我还将我的外部文件放入提供程序(通过外部路径),但对于可移动SD卡中的文件,它不起作用.说这个文件夹之类的东西没有被授权.
任何帮助将不胜感激.
谢谢
我正在尝试使用BitmapFactory.decodefile()来创建相机照片的缩小版本,并将其设置为我的framelayout中的imageview.遵循Android开发人员的以下说明:https: //developer.android.com/training/camera/photobasics.html 在这些说明中,文件创建并存储在fileprovider中,该文件提供程序包含一些以xml格式化的元数据文件.不知何故,BitmapFactory.decodefile()似乎无法访问此文件,该文件存储内容uri驻留在fileprovider中的图片.fileprovider是在androidmanifest文件中创建的,如下所示:
<provider
android:authorities="mypackagename.fileprovider"
android:name="android.support.v4.content.FileProvider"
android:exported="false" android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" >
</meta-data>
</provider>
Run Code Online (Sandbox Code Playgroud)
file_paths xml文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="Android/data/mypackagename/files/Pictures/" />
</paths>
Run Code Online (Sandbox Code Playgroud)
通过以下方法生成图片所在的文件名:
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(imageFileName,".jpg",storageDir);
// Save a file: path for use with ACTION_VIEW intents
mCurrentPhotoPath = image.getAbsolutePath();
Log.d("absolute",""+image.getAbsolutePath());
return image;
} …Run Code Online (Sandbox Code Playgroud) android uri android-intent bitmapfactory android-fileprovider
我将应用程序迁移到AndroidX,并且在API级别21上启动时崩溃。我的应用程序抛出以下异常:
10-08 09:42:50.930 11346-11346/com.example.test E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.test, PID: 11346
java.lang.RuntimeException: Unable to get provider androidx.core.content.FileProvider: java.lang.ClassNotFoundException: Didn't find class "androidx.core.content.FileProvider" on path: DexPathList[[zip file "/data/app/com.example.test-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.test-1, /vendor/lib, /system/lib]]
at android.app.ActivityThread.installProvider(ActivityThread.java:5121)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:4713)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4596)
at android.app.ActivityThread.access$1600(ActivityThread.java:169)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1340)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5487)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.core.content.FileProvider" on path: DexPathList[[zip file "/data/app/com.example.test.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.test-1, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
at android.app.ActivityThread.installProvider(ActivityThread.java:5106) …Run Code Online (Sandbox Code Playgroud) android android-support-library android-fileprovider androidx
我正在尝试为 unity3d 构建一个 android 插件,它只需通过 FileProvider 将屏幕截图共享给另一个应用程序。
我将我的项目迁移到 androidx。
我使用了 androidx.core.content.FileProvider 类。
每当我启动应用程序时,它就会崩溃,并显示以下 Logcat:
2018-12-22 21:46:13.678 14755-14755/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.anascompany.testandroidplugin, PID: 14755
java.lang.RuntimeException: Unable to get provider androidx.core.content.FileProvider: java.lang.ClassNotFoundException: Didn't find class "androidx.core.content.FileProvider" on path: DexPathList[[zip file "/data/app/com.anascompany.testandroidplugin-bwZMktz2HTL449ojsD7y9g==/base.apk"],nativeLibraryDirectories=[/data/app/com.anascompany.testandroidplugin-bwZMktz2HTL449ojsD7y9g==/lib/x86, /data/app/com.anascompany.testandroidplugin-bwZMktz2HTL449ojsD7y9g==/base.apk!/lib/x86, /system/lib]]
at android.app.ActivityThread.installProvider(ActivityThread.java:6396)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:5938)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5853)
at android.app.ActivityThread.access$1100(ActivityThread.java:199)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.core.content.FileProvider" on path: DexPathList[[zip file "/data/app/com.anascompany.testandroidplugin-bwZMktz2HTL449ojsD7y9g==/base.apk"],nativeLibraryDirectories=[/data/app/com.anascompany.testandroidplugin-bwZMktz2HTL449ojsD7y9g==/lib/x86, /data/app/com.anascompany.testandroidplugin-bwZMktz2HTL449ojsD7y9g==/base.apk!/lib/x86, /system/lib]] …Run Code Online (Sandbox Code Playgroud) 由于Android在有关文件访问的不同主要版本之间非常不一致,因此我感到有些失落。我尝试尽可能简单地描述问题:
我的公司使用商业本地DRM保护我们提供的其他本地库。我们有一个许可应用程序,该应用程序调用了一些Voodoo来结束/ sdcard / companyname / LicenseContainer /中的许可文件。其他受保护的应用程序以本机代码查看此目录,检查用户是否具有有效的许可证。
但是,Android 10更新仅提供,使该工作流程完全无效scoped storage access。我们可以使用一种方法Storage Manager来授予访问权限,不幸的是,现在也已弃用该方法。
所以我的问题是:一个应用程序如何将文件保存到/ sdcard / FOLDER上的某个位置
对于所有可能的解决方案(SAF,FileProvider等),我有点不知所措,这些解决方案通常会调用一个应用程序将权限授予另一个应用程序的权限。但是,如果没有安装的第一个应用程序将文件放到那里,则应该可以访问这些文件。
我知道必须有解决方案,因为最近的FileManagers(即Files by Google)可以访问整个/sdcard/目录。
在不调用“黑客”之类的情况下,最简单,最适合未来的路线是什么 android:requestLegacyExternalStorage="true"
android file android-fileprovider storage-access-framework scoped-storage
我试图生成一个 CSV 文件(加速度计的),将它保存到我的Context.getFilesDir().
问题是,当我尝试共享它,错误Writing exception to parcel,java.lang.SecurityException: Permission Denial: reading android.support.v4.content.FileProvider uri content://...csv requires the provider be exported, or grantUriPermission()不断发生。
我有...
grantUriPermission()并Intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)正如其他人所建议的那样。Environment.getExternalStorageDirectory(),但它不起作用,因为我的手机没有外部存储。那我能做什么?或者这是生成和共享 CSV 文件的更好方法吗?任何建议将不胜感激。谢谢你们。
现在的代码片段
在 AndroidManifest.xml 中:
<application...>
...
<provider
android:name="android.support.v4.content.FileProvider"
android:grantUriPermissions="true"
android:authorities="com.example.FileProvider"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
</application>
Run Code Online (Sandbox Code Playgroud)
在 provider_path.xml 中
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="files" path="."/>
</paths>
Run Code Online (Sandbox Code Playgroud)
在 mainActivity.java 中
private void onShareCSV() {
Uri path = FileProvider.getUriForFile(this, "com.example.FileProvider", new …Run Code Online (Sandbox Code Playgroud) 我在 chromebook 上有一个(大)问题,其功能在“经典”Android 设备(手机、平板电脑)上运行良好。
我尝试发送带有附件的电子邮件。
这是部分代码(api>=23)。
Run Code Online (Sandbox Code Playgroud)Intent email = new Intent(Intent.ACTION_SEND); String[] str = new String[1]; str[0] = "destination@yahoo.fr"; email.putExtra(Intent.EXTRA_EMAIL, str); email.putExtra(Intent.EXTRA_TEXT, "My text"); email.putExtra(Intent.EXTRA_SUBJECT, "My subject"); Uri uri = FileProvider.getUriForFile(this, "com.TTT.fileprovider", new File(dest)); email.putExtra(android.content.Intent.EXTRA_STREAM, uri); email.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); email.setType("message/rfc822"); startActivity(email);
在我的手机(android 9 api 28)上,调用了 gmail 应用程序,所有文本字段都填充了正确的信息,并且文件 (myResume.pdf) 已正确附加。
发送然后接收时,电子邮件包含一个可读的 pdf 文件。这很酷。
使用我的 chromebook (PB 314 / v. 83.0.4103.119),gmail 被调用,所有文本字段都填充了正确的信息,但没有附加文件。
LogCat 表示:
2020-06-27 15:25:50.886 127-2348/? I/ActivityManager: START u0 {act=android.intent.action.SEND typ=message/rfc822 flg=0x43 cmp=org.chromium.arc.applauncher/.ChromeBrowserProxyActivity clip={message/rfc822 T:My text} (has …Run Code Online (Sandbox Code Playgroud)