我可以共享从除相机之外的其他文件夹添加的文件。我在 Lenova K3 Note 中遇到以下异常。
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/9016-4EF8/DCIM/Camera/IMG_20180317_111252.jpg
Run Code Online (Sandbox Code Playgroud)
文件路径.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path
name="Camera"
path="/Camera/" />
<files-path
name="Files"
path="." />
<external-path
name="Downloads"
path="/Download/" />
<external-path
name="WhatsApp"
path="/WhatsApp/" />
<external-path
name="Camera"
path="/Camera/" />
<external-path
name="Others"
path="." />
<external-files-path
name="Camera"
path="/Camera/" />
<external-files-path
name="Files"
path="." />
</paths>
Run Code Online (Sandbox Code Playgroud) 我有以下代码,它仅适用于 Android 7 及更低版本。Android 8 只显示一个空白文件,我手动打开 pdf 并且工作正常。
我有以下代码,这是回购:
private static final String SHARED_PROVIDER_AUTHORITY = BuildConfig.APPLICATION_ID + ".myfileprovider";
private static final String PDF_FOLDER = "pdf";
Bitmap bitmap = myCanvasView.getBitmap();
PdfDocument document = new PdfDocument();
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(bitmap.getWidth(), bitmap.getHeight(), 1).create();
PdfDocument.Page page = document.startPage(pageInfo);
Canvas canvas = page.getCanvas();
Paint paint = new Paint();
paint.setColor(Color.parseColor("#ffffff"));
canvas.drawPaint(paint);
bitmap = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth(), bitmap.getHeight(), true);
document.finishPage(page);
// write the document content
File file = null;
try {
file = createFile();
document.writeTo(new …Run Code Online (Sandbox Code Playgroud) 如果我尝试像这样添加我的 FileProvider:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.myfileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
Run Code Online (Sandbox Code Playgroud)
我遇到了以下问题:
Caused by: java.lang.RuntimeException: Manifest merger failed with multiple errors, see logs
at com.android.builder.core.AndroidBuilder.mergeManifestsForApplication(AndroidBuilder.java:524)
at com.android.build.gradle.tasks.MergeManifests.doFullTaskAction(MergeManifests.java:143)
at com.android.build.gradle.internal.tasks.IncrementalTask.taskAction(IncrementalTask.java:106)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:50)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:131)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:317)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:309)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:185)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:97)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:120)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:99)
Run Code Online (Sandbox Code Playgroud)
如果我删除“权威”行,我会得到这个:
Manifest merger failed : Attribute meta-data#android.support.FILE_PROVIDER_PATHS@resource value=(@xml/provider_paths) from AndroidManifest.xml:374:17-55
is also present at [io.smooch:ui:5.12.5] AndroidManifest.xml:50:17-51 value=(@xml/file_paths).
Suggestion: add 'tools:replace="android:resource"' to <meta-data> element at AndroidManifest.xml:372:13-374:58 to …Run Code Online (Sandbox Code Playgroud) 我需要帮助来获取我们通过 Intent 从下载文件夹或任何其他文件夹中选择的内容的文件路径。我附上了一个我一直在使用的fileUtil类,它在牛轧糖版本之前运行良好。但是对于奥利奥以及在某些特定设备中也是如此,我们会收到一个空路径作为回报。因此,如果有人遇到过此类错误并找到了解决方案,请在此处分享。
if(resultCode ==RESULT_OK)
{
final Uri uri = data.getData();
// Get the File path from the Uri
String path = FileUtils.getPath(this, uri);
// Alternatively, use FileUtils.getFile(Context, Uri)
if (path != null && FileUtils.isLocal(path)) {
//File file = new File(path);
this.file = new File(path);
profile_imagepath = path;
filename = file.getName();
txtselectedfile.setText(filename);
}
}
Run Code Online (Sandbox Code Playgroud) 因此,在过去的一天里,我一直在用头撞墙,试图找出为什么文件无法附加到电子邮件中。每次应用程序运行时,我都会收到一条弹出的小消息,提示“无法附加文件”。收件人和主题字段的填写正如我所期望的那样。第一个问题是,如何找到此错误背后的更多信息?此消息是从 GMail 应用程序抛出的,而不是我自己的程序。它肯定会为我指明正确的方向,这样如果我有这个错误的原因,我可以自己进一步调试。我在下面包含了可能相关的信息。文件大小为 78.5kb,我可以验证该文件是否存在并且具有我想要附加的正确内容。根据文件资源管理器,文件的所有者和组的权限为 rw。
我在写这篇文章时发现了一些有趣的事情;当使用文件资源管理器在 gmail 应用程序中添加附件时,Android/data 目录不是一个选项!当您在 Gmail 应用程序之外使用文件资源管理器时,它会出现。所以我想这可能是权限问题?它无法访问该文件夹。如果是这种情况,建议存储该文件的位置是什么?理想情况下,在这种情况下,它是某种缓存位置或临时文件位置。
我尝试在 Android Outlook 应用程序而不是 GMail 中添加附件,并且文件确实已附加。
尝试使用 Pixel 4 模拟器在 Android 11 API 30 上运行。
电子邮件意图代码:
protected void sendEmail(File f){
final String[] TO = { "foo@bar.com" };
Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse("mailto:"));
emailIntent.putExtra(Intent.EXTRA_EMAIL, TO);
emailIntent.putExtra(Intent.EXTRA_SUBJECT, f.getName().replaceAll("(?i).pdf", ""));
if (!f.exists() || !f.canRead()) {
Toast.makeText(this, "Attachment Error", Toast.LENGTH_SHORT).show();
finish();
return;
}
emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri uri = FileProvider.getUriForFile(getApplicationContext(), BuildConfig.APPLICATION_ID, f);
emailIntent.putExtra(Intent.EXTRA_STREAM, uri);
try {
startActivity(emailIntent);
finish();
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(MainActivity.this, …Run Code Online (Sandbox Code Playgroud) 尝试在默认图库应用程序中打开图像。我无法按照以下步骤解决此问题:我的文件路径是/data/data/{applicationName}/cache/file.jpg
意图:
Intent intent = new Intent(Intent.ACTION_VIEW);
File file = new File(filePath);
intent.setDataAndType(FileProvider.getUriForFile(this, getApplicationContext()
.getPackageName() + ".provider", file),"image/*");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Run Code Online (Sandbox Code Playgroud)
表现:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
Run Code Online (Sandbox Code Playgroud)
provider_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="external_files"
path="." />
</paths>
Run Code Online (Sandbox Code Playgroud)
我试过更改provider_paths中的路径和名称,但是没有运气。
我在/storage/emulated/0/Download/app-debug.apk中有一个APK文件。我要通过FileProvider安装此文件,因为我正在使用AndroidN。
当我尝试启动Intent Logcat时,没有显示任何错误,但是我在手机上收到以下消息:
解析软件包时出现问题。
我究竟做错了什么?
主要活动
public class MainActivity extends AppCompatActivity {
Button btnStartIntent;
String strRootPathInternalStorage = Environment.getExternalStorageDirectory().toString(); //-> /storage/emulated/0 //-> /storage/emulated/0/Download/
String strApkToInstall = "app-debug.apk";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
--> Booooh bad way! <--
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
*/
btnStartIntent = (Button)findViewById(R.id.btnStartIntent);
btnStartIntent.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
installApk(MainActivity.this, strRootPathInternalStorage+"/Download/"+strApkToInstall);
}
});
}
public static void installApk(Context context, String apkPath) {
if (context == null || TextUtils.isEmpty(apkPath)) {
return;
} …Run Code Online (Sandbox Code Playgroud) 伙计们,我正在开发一个需要外部应用程序依赖项(.aar文件)的android应用程序,该库应用程序具有其自己的文件提供程序,而我的应用程序也具有其自己的文件提供程序。
当我将库作为单独的应用程序运行时,库运行良好,但是当我将其包含在应用程序中时,相机功能将无法正常工作。我收到以下错误
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
Run Code Online (Sandbox Code Playgroud)
跟随应用程序的清单文件
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
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)
以下是lib模块的清单文件
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.ma.bot.provider"
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)
应用程序和lib模块具有不同的包名称,如何将这2个文件提供程序添加到应用程序中,我也尝试使用多个文件提供程序,但是在应用程序编译时出现XML解析错误。
android:authorities="${applicationId}.provider;com.ma.bot.provider"
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题。
我想让用户在 Android 中的特定文件夹下选择一个文件,无论是使用内置 ui 还是第三方文件管理器。但是,我无法在较新版本的 android 上执行此操作ACTION_OPEN_DOCUMENT。我阅读了有关需要 DocumentProvider 来提供内容 uri 的文档,但是我对此感到非常困惑,因为没有“内置”的,而且根据文档,实现您自己的此类内容的目的似乎是将文件提供给其他的这不是我想要在这里做的。
在 android 实际上禁止file://uri 之前,我所做的是使用 ACTION_GET_CONTENT 和 'file://' uri 来与大多数第三方文件管理器应用程序一起使用。因此,如果有人知道 7.0 之后支持该功能的一些技巧,我也会很感激。
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
Uri uri = Uri.parse(Environment.getExternalStorageDirectory() + "/myFolder/");
intent.setType("text/csv");
DocumentFile file = DocumentFile.fromSingleUri(getApplicationContext(), uri);
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, file.getUri());
intent.putExtra("android.content.extra.SHOW_ADVANCED", true);
intent.putExtra("android.content.extra.FANCY", true);
intent.putExtra("android.content.extra.SHOW_FILESIZE", true);
try {
startActivityForResult(intent, 1);
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(getApplicationContext(), "Please install a File Manager.", Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)
这段代码只会进入“最近”文件夹,而不是我拥有的文件夹。
下面的代码用于尝试文件提供程序以准备android Nougat:
清单文件:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.securefilesharing"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="25" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".HomeSecureFileShareTestActivity"
android:label="@string/title_activity_home_secure_file_share_test" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.securefilesharing.fileprovider"
android:enabled="false"
android:grantUriPermissions="true" >
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider_path" />
</provider>
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
文件提供程序xml:
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="/"/>
</paths>
Run Code Online (Sandbox Code Playgroud)
构造URI并传递给相机意图:
private Uri createImageFile() throws Exception {
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), System.currentTimeMillis() + …Run Code Online (Sandbox Code Playgroud) android ×8
android-file ×2
uri ×2
aar ×1
apk ×1
file ×1
installation ×1
java ×1
merge ×1
smooch ×1