【发布时间】:2019-09-08 04:06:41
【问题描述】:
我曾经使用以下代码将照片从我的应用程序发送到 Instagram...
this.Publish(new MaskMessageEvent("Copy ready for Instagram App", true));
var bytes = e.Result; // get the downloaded data
/// You must first save your file in PNG or JPEG (preferred) format and use the filename extension ".ig"
/// Using the iOS Document Interaction APIs you can trigger the photo to be opened by Instagram.
/// The Identifier for our Document Interaction UTI is com.instagram.photo,
/// and it conforms to the public/jpeg and public/png UTIs.
/// Alternatively, if you want to show only Instagram in the application list
/// (instead of Instagram plus any other public/jpeg-conforming apps) you can specify the
/// extension class igo, which is of type com.instagram.exclusivegram.
//Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
string localFilename = "temp.jpg"; // <-- NOTE IGO to exclusively show instagram
string localPath = Path.Combine(ExternalStorageDirectory, localFilename);
File.WriteAllBytes(localPath, bytes); // writes to local storage
this.Publish(new MaskMessageEvent("Copy ready for Instagram App", false));
/// See the Apple documentation articles: Previewing and Opening Files and the
/// UIDocumentInteractionController Class Reference for more information.
Xamarin.Forms.Device.BeginInvokeOnMainThread(() =>
{
this.Publish(new MaskMessageEvent("Launching Instagram App", true));
Intent shareIntent = new Intent(Intent.ActionSend);
shareIntent.SetType("image/*");
Java.IO.File media = new Java.IO.File(ExternalStorageDirectory + Java.IO.File.Separator + localFilename);
Android.Net.Uri uri = Android.Net.Uri.FromFile(media);
shareIntent.PutExtra(Intent.ExtraStream, uri); // set uri
shareIntent.SetPackage("com.instagram.android");
Forms.Context.StartActivity(shareIntent);
this.Publish(new MaskMessageEvent("Launching Instagram App", false));
this.Publish(new InstagramServiceEvent(message, true));
});
但现在如果我以 Android 7+ 为目标,我会收到以下错误
[MonoDroid] UNHANDLED EXCEPTION:
[MonoDroid] Android.OS.FileUriExposedException: file:///storage/emulated/0/temp.jpg exposed beyond app through ClipData.Item.getUri()
[MonoDroid] at Java.Interop.JniEnvironment+InstanceMethods.CallNonvirtualVoidMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x00089] in <405ad2ab226e4e74ba67db96baf95129>:0
[MonoDroid] at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x0005d] in <405ad2ab226e4e74ba67db96baf95129>:0
[MonoDroid] at Android.Content.ContextWrapper.StartActivity (Android.Content.Intent intent) [0x00031] in <476f28c60f03479ab89477af687cdc1a>:0
[MonoDroid] at nativeapp.Droid.InstagramService+<>c__DisplayClass6_1.<SendToInstagram>b__1 () [0x0007a] in /Users/rob/Documents/GitHub/social-scheduler/nativeapp/Droid/Services/InstagramService.cs:122
[MonoDroid] at Java.Lang.Thread+RunnableImplementor.Run () [0x00008] in <476f28c60f03479ab89477af687cdc1a>:0
[MonoDroid] at Java.Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) [0x00009] in <476f28c60f03479ab89477af687cdc1a>:0
[MonoDroid] at (wrapper dynamic-method) System.Object.17(intptr,intptr)
[MonoDroid] --- End of managed Android.OS.FileUriExposedException stack trace ---
[MonoDroid] android.os.FileUriExposedException: file:///storage/emulated/0/temp.jpg exposed beyond app through ClipData.Item.getUri()
[MonoDroid] at android.os.StrictMode.onFileUriExposed(StrictMode.java:1960)
[MonoDroid] at android.net.Uri.checkFileUriExposed(Uri.java:2356)
[MonoDroid] at android.content.ClipData.prepareToLeaveProcess(ClipData.java:942)
[MonoDroid] at android.content.Intent.prepareToLeaveProcess(Intent.java:9850)
[MonoDroid] at android.content.Intent.prepareToLeaveProcess(Intent.java:9835)
[MonoDroid] at android.app.Instrumentation.execStartActivity(Instrumentation.java:1610)
[MonoDroid] at android.app.Activity.startActivityForResult(Activity.java:4487)
[MonoDroid] at android.app.Activity.startActivityForResult(Activity.java:4445)
[MonoDroid] at android.app.Activity.startActivity(Activity.java:4806)
[MonoDroid] at android.app.Activity.startActivity(Activity.java:4774)
[MonoDroid] at mono.java.lang.RunnableImplementor.n_run(Native Method)
[MonoDroid] at mono.java.lang.RunnableImplementor.run(RunnableImplementor.java:30)
[MonoDroid] at android.os.Handler.handleCallback(Handler.java:790)
[MonoDroid] at android.os.Handler.dispatchMessage(Handler.java:99)
[MonoDroid] at android.os.Looper.loop(Looper.java:164)
[MonoDroid] at android.app.ActivityThread.main(ActivityThread.java:6494)
[MonoDroid] at java.lang.reflect.Method.invoke(Native Method)
[MonoDroid] at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
[MonoDroid] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
[MonoDroid]
我已经看到一些关于使用文件处理程序 FileProvider 的参考(请参阅 ProAndroidDev article ),但我不太了解它是如何工作的,以及它是否能让我简单地将图像传递给 Instagram。它在文章中提到的所有领域的东西都让我很困惑。
有没有更好的方法让我简单地将图像传递到 Instagram?将来我也想考虑视频支持,所以如果能考虑到这一点,那就太好了。
目前我已将目标 Android 版本设置为 6,以便应用继续运行,但我确实想将目标设置为更现代的版本,这是我唯一的绊脚石。
【问题讨论】:
-
是的,您需要在您的 Xamarin.Android 应用程序项目中实现
FileProvider -
谢谢@SushiHangover - 我现在已经实现了它,它可以工作了????
-
请将您的解决方案作为答案发布并接受,以便将此问题标记为已回答。帮助其他搜索问题以帮助他们,这样他们就不会浪费时间在已回答的问题上。谢谢!
-
嗨@Leon Lu - 我现在已经提交了我的答案供您考虑。
-
感谢您的分享,请标记为回答
标签: android xamarin xamarin.forms instagram android-7.0-nougat