Xamarin Android:通过标准API(电子邮件,脸谱等)分享图像

F0r*_*gan 5 android xamarin.android xamarin

我需要在Xamarin Android中实现标准共享.我发现并更改了Xamarin的代码.看起来像这样

    public void Share (string title, string content)
    {
        if (string.IsNullOrEmpty (title) || string.IsNullOrEmpty (content))
            return;

        var name = Application.Context.Resources.GetResourceName (Resource.Drawable.icon_120).Replace (':', '/');
        var imageUri = Uri.Parse ("android.resource://" + name);
        var sharingIntent = new Intent ();
        sharingIntent.SetAction (Intent.ActionSend);
        sharingIntent.SetType ("image/*");
        sharingIntent.PutExtra (Intent.ExtraText, content);
        sharingIntent.PutExtra (Intent.ExtraStream, imageUri);
        sharingIntent.AddFlags (ActivityFlags.GrantReadUriPermission);
        ActivityContext.Current.StartActivity (Intent.CreateChooser (sharingIntent, title));
    }
Run Code Online (Sandbox Code Playgroud)

此代码调用标准共享功能,但当我选择Facebook或电子邮件时,我得到"无法加载图像".文件位于"/Resources/drawable-xhdpi/icon_120.png".

你能指出我做错了什么吗?

Iai*_*ith 7

我认为应用程序图标是在您的应用程序专用的目录中创建的,因此其他应用程序无法获取它.

您需要将其保存在其他应用程序可以访问的位置,然后从该位置共享它,如下所示:

public void Share (string title, string content)
{
    if (string.IsNullOrEmpty (title) || string.IsNullOrEmpty (content))
                return;

    Bitmap b = BitmapFactory.DecodeResource(Resources,Resource.Drawable.icon_120);

    var tempFilename = "test.png";
    var sdCardPath = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
    var filePath = System.IO.Path.Combine(sdCardPath, tempFilename);
    using (var os = new FileStream(filePath, FileMode.Create))
    {
        b.Compress(Bitmap.CompressFormat.Png, 100, os);
    }
    b.Dispose ();

    var imageUri = Android.Net.Uri.Parse ($"file://{sdCardPath}/{tempFilename}");
    var sharingIntent = new Intent ();
    sharingIntent.SetAction (Intent.ActionSend);
    sharingIntent.SetType ("image/*");
    sharingIntent.PutExtra (Intent.ExtraText, content);
    sharingIntent.PutExtra (Intent.ExtraStream, imageUri);
    sharingIntent.AddFlags (ActivityFlags.GrantReadUriPermission);
    StartActivity (Intent.CreateChooser (sharingIntent, title));
}
Run Code Online (Sandbox Code Playgroud)

还要为您的应用添加ReadExternalStorage和WriteExternalStorage权限.

如果有效,请告诉我.