Android ACTION_SEND(多个)意图不将文件发送到 Google 驱动器
Android ACTION_SEND (MULTIPLE) intent does not send files to Google Drive
我有图片保存为文件。然后我尝试分享它们。
它适用于所有 Messenger 应用程序,但不适用于 Google 驱动器。我收到来自 Google 驱动器的通知错误。
首先,在共享弹出窗口中选择 Google 驱动器后,我可以 choose Folder。这意味着 Google 驱动器可以看到我的文件( 或者可能只有名字?)。
之后我立即从 Google 驱动器中收到 error notification,提示“上传错误,无法计划上传 2 个文件”( 或我选择的其他文件数量).
意图创建方法:
@NotNull
private Intent initIntent() {
Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
intent.setType("image/jpg");
intent.putExtra(Intent.EXTRA_SUBJECT, "Pictures");
intent.putExtra(Intent.EXTRA_TEXT, "Pictures share");
return intent;
}
尝试发送一个(与 ACTION_SEND_MULTIPLE 或 ACTION_SEND),尝试添加不同的 EXTRA_SUBJECT、EXTRA_TEXT、EXTRA_MAIL,将 EXTRA_TEXT 添加为 ArrayList( 和 intent.putCharSequenceArrayListExtra)。尝试将不同的标志添加到意图中,如 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)。没有任何帮助。
意图方法的额外图片:
private void addPicturesExtra(Intent intent) {
ArrayList<Uri> uris = new ArrayList<>(pictures.size());
for (PicturePresentation picture : pictures) {
File picFile = new File(picture.getPath());
Uri uri = Uri.fromFile(picFile);
uris.add(uri);
}
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
}
正如我之前所说,尝试使用一个 Uri(图片文件路径)并将 ArrayList 作为 intent extra 和一个 Uri 对象的参数。
意图启动方法:
private void startIntent(Intent intent) {
try {
activity.startActivity(Intent.createChooser(intent, "Send"));
} catch (Exception ex) {
ExceptionHandler.handle(ex);
}
}
尝试使用或不使用选择器启动它。它没有帮助。非常奇怪,它适用于所有其他应用程序,但不适用于 Google 驱动器。
当尝试将图片上传到 Google 驱动器时,您可以在下面找到 Logcat 的堆栈跟踪。
2020-10-15 15:47:49.871 V/FA: Activity resumed, time: 1113377792
2020-10-15 15:47:49.890 V/FA: Connecting to remote service
2020-10-15 15:47:49.899 D/FA: Connected to remote service
2020-10-15 15:47:49.900 V/FA: Processing queued up service tasks: 1
2020-10-15 15:47:54.904 V/FA: Inactivity, disconnecting from the service
2020-10-15 15:47:54.905 W/ConnectionTracker: Exception thrown while unbinding
java.lang.IllegalArgumentException: Service not registered: com.google.android.gms.measurement.internal.zzji@6e14ca2
at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:1759)
at android.app.ContextImpl.unbindService(ContextImpl.java:1786)
at android.content.ContextWrapper.unbindService(ContextWrapper.java:751)
at com.google.android.gms.common.stats.ConnectionTracker.zza(com.google.android.gms:play-services-basement@@17.3.0:55)
at com.google.android.gms.common.stats.ConnectionTracker.unbindService(com.google.android.gms:play-services-basement@@17.3.0:50)
at com.google.android.gms.measurement.internal.zzio.zzag(com.google.android.gms:play-services-measurement-impl@@17.6.0:245)
at com.google.android.gms.measurement.internal.zzio.zzal(com.google.android.gms:play-services-measurement-impl@@17.6.0:262)
at com.google.android.gms.measurement.internal.zzio.zzc(com.google.android.gms:play-services-measurement-impl@@17.6.0:336)
at com.google.android.gms.measurement.internal.zzir.zza(com.google.android.gms:play-services-measurement-impl@@17.6.0:2)
at com.google.android.gms.measurement.internal.zzai.run(com.google.android.gms:play-services-measurement-impl@@17.6.0:7)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at com.google.android.gms.measurement.internal.zzfs.run(com.google.android.gms:play-services-measurement-impl@@17.6.0:21)
唯一的例外是 IllegalArgumentException,我认为它来自 GoogleAnalytics。无论如何,我认为它与我面临的问题无关。 (我在其他一些情况下也有)
我是不是遗漏了一些明显的东西,还是只是 Google 驱动器的错误?非常感谢任何帮助!
感谢 CommonsWare,我解决了这个问题!
所以,首先,我们需要使用
Uri uri = FileProvider.getUriForFile(context, "com.test", picFile)
而不是
Uri uri = Uri.fromFile(picFile);
因此 FileProvider 会为我们的文件生成特殊的 Uri,路径前面带有 "content://"。
然后我们需要在App清单中声明我们的FileProvider。
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.test.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
还有带有路径的附加文件
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path
name="pics"
path="pics/" />
<external-files-path
name="pdf"
path="pdf/" />
</paths>
我有图片保存为文件。然后我尝试分享它们。
它适用于所有 Messenger 应用程序,但不适用于 Google 驱动器。我收到来自 Google 驱动器的通知错误。
首先,在共享弹出窗口中选择 Google 驱动器后,我可以 choose Folder。这意味着 Google 驱动器可以看到我的文件( 或者可能只有名字?)。
之后我立即从 Google 驱动器中收到 error notification,提示“上传错误,无法计划上传 2 个文件”( 或我选择的其他文件数量).
意图创建方法:
@NotNull
private Intent initIntent() {
Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE);
intent.setType("image/jpg");
intent.putExtra(Intent.EXTRA_SUBJECT, "Pictures");
intent.putExtra(Intent.EXTRA_TEXT, "Pictures share");
return intent;
}
尝试发送一个(与 ACTION_SEND_MULTIPLE 或 ACTION_SEND),尝试添加不同的 EXTRA_SUBJECT、EXTRA_TEXT、EXTRA_MAIL,将 EXTRA_TEXT 添加为 ArrayList( 和 intent.putCharSequenceArrayListExtra)。尝试将不同的标志添加到意图中,如 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)。没有任何帮助。
意图方法的额外图片:
private void addPicturesExtra(Intent intent) {
ArrayList<Uri> uris = new ArrayList<>(pictures.size());
for (PicturePresentation picture : pictures) {
File picFile = new File(picture.getPath());
Uri uri = Uri.fromFile(picFile);
uris.add(uri);
}
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
}
正如我之前所说,尝试使用一个 Uri(图片文件路径)并将 ArrayList 作为 intent extra 和一个 Uri 对象的参数。
意图启动方法:
private void startIntent(Intent intent) {
try {
activity.startActivity(Intent.createChooser(intent, "Send"));
} catch (Exception ex) {
ExceptionHandler.handle(ex);
}
}
尝试使用或不使用选择器启动它。它没有帮助。非常奇怪,它适用于所有其他应用程序,但不适用于 Google 驱动器。
当尝试将图片上传到 Google 驱动器时,您可以在下面找到 Logcat 的堆栈跟踪。
2020-10-15 15:47:49.871 V/FA: Activity resumed, time: 1113377792
2020-10-15 15:47:49.890 V/FA: Connecting to remote service
2020-10-15 15:47:49.899 D/FA: Connected to remote service
2020-10-15 15:47:49.900 V/FA: Processing queued up service tasks: 1
2020-10-15 15:47:54.904 V/FA: Inactivity, disconnecting from the service
2020-10-15 15:47:54.905 W/ConnectionTracker: Exception thrown while unbinding
java.lang.IllegalArgumentException: Service not registered: com.google.android.gms.measurement.internal.zzji@6e14ca2
at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:1759)
at android.app.ContextImpl.unbindService(ContextImpl.java:1786)
at android.content.ContextWrapper.unbindService(ContextWrapper.java:751)
at com.google.android.gms.common.stats.ConnectionTracker.zza(com.google.android.gms:play-services-basement@@17.3.0:55)
at com.google.android.gms.common.stats.ConnectionTracker.unbindService(com.google.android.gms:play-services-basement@@17.3.0:50)
at com.google.android.gms.measurement.internal.zzio.zzag(com.google.android.gms:play-services-measurement-impl@@17.6.0:245)
at com.google.android.gms.measurement.internal.zzio.zzal(com.google.android.gms:play-services-measurement-impl@@17.6.0:262)
at com.google.android.gms.measurement.internal.zzio.zzc(com.google.android.gms:play-services-measurement-impl@@17.6.0:336)
at com.google.android.gms.measurement.internal.zzir.zza(com.google.android.gms:play-services-measurement-impl@@17.6.0:2)
at com.google.android.gms.measurement.internal.zzai.run(com.google.android.gms:play-services-measurement-impl@@17.6.0:7)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at com.google.android.gms.measurement.internal.zzfs.run(com.google.android.gms:play-services-measurement-impl@@17.6.0:21)
唯一的例外是 IllegalArgumentException,我认为它来自 GoogleAnalytics。无论如何,我认为它与我面临的问题无关。 (我在其他一些情况下也有)
我是不是遗漏了一些明显的东西,还是只是 Google 驱动器的错误?非常感谢任何帮助!
感谢 CommonsWare,我解决了这个问题!
所以,首先,我们需要使用
Uri uri = FileProvider.getUriForFile(context, "com.test", picFile)
而不是
Uri uri = Uri.fromFile(picFile);
因此 FileProvider 会为我们的文件生成特殊的 Uri,路径前面带有 "content://"。
然后我们需要在App清单中声明我们的FileProvider。
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.test.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
还有带有路径的附加文件
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path
name="pics"
path="pics/" />
<external-files-path
name="pdf"
path="pdf/" />
</paths>