Xamarin Android: Compartir imagen a través de la API estándar (correo electrónico, facebook, etc.)

Tengo que implementar el intercambio estándar en Xamarin Android. Encontré y cambié el código para Xamarin. Se parece a esto

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)); } 

Esta función de código de llamada de código estándar, pero cuando elijo Facebook o correo electrónico, estoy recibiendo "imagen de carga Cant". El archivo se encuentra en "/Resources/drawable-xhdpi/icon_120.png".

¿Puedes señalarme lo que estoy haciendo mal?

Creo que el icono de la aplicación se crea en un directorio privado para tu aplicación, por lo que otras aplicaciones no podrán acceder a ella.

Tendrás que guardarlo en algún lugar donde las otras aplicaciones puedan acceder a él y luego compartirlo desde esa ubicación algo como esto:

 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)); } 

También agregue permisos ReadExternalStorage y WriteExternalStorage a su aplicación.

Avísame si funciona.

He implementado compartir para twitter y fb. Puedes usar ShareDialog nativo de facebook y si no está disponible, usa OAuth2Authenticator para obtener token de acceso, luego publica usando FB graph y usando OAuth1Authenticator para posar en twitter.

 public void ShareViaSocial(string serviceType, string urlToShare) { ShareDialog di = new ShareDialog(MainActivity.Instance); var facebookShareContent = new ShareLinkContent.Builder(); facebookShareContent.SetContentUrl(Android.Net.Uri.Parse(urlToShare)); if (serviceType == "Facebook") { if (di.CanShow(facebookShareContent.Build(), ShareDialog.Mode.Automatic)) { di.Show(facebookShareContent.Build()); } else { var auth = new OAuth2Authenticator( clientId: 'ClientId', scope: "public_profile,publish_actions", authorizeUrl: new Uri("https://m.facebook.com/dialog/oauth/"), redirectUrl: new Uri( "http://www.facebook.com/connect/login_success.html")); MainActivity.Instance.StartActivity(auth.GetUI(MainActivity.Instance.ApplicationContext)); auth.AllowCancel = true; auth.Completed += (s, e) => { if (e.IsAuthenticated) { Account fbAccount = e.Account; Dictionary<string, string> dictionaryParameters = new Dictionary<string, string>() { { "link", urlToShare } }; var requestUrl = new Uri("https://graph.facebook.com/me/feed"); var request = new OAuth2Request(SharedConstants.requestMethodPOST, requestUrl, dictionaryParameters, fbAccount); request.GetResponseAsync().ContinueWith(this.requestResult); } else { OnShare(this, ShareStatus.NotSuccessful); } }; auth.Error += Auth_Error; } } else { var auth = new OAuth1Authenticator( 'TwitterConsumerKey', 'TwitterConsumerSecret', new Uri("https://api.twitter.com/oauth/request_token"), new Uri("https://api.twitter.com/oauth/authorize"), new Uri("https://api.twitter.com/oauth/access_token"), new Uri('TwitterCallBackUrl')); auth.AllowCancel = true; // auth.ShowUIErrors = false; // If authorization succeeds or is canceled, .Completed will be fired. auth.Completed += (s, e) => { // We presented the UI, so it's up to us to dismiss it. if (e.IsAuthenticated) { Account twitterAccount = e.Account; Dictionary<string, string> dictionaryParameters = new Dictionary<string, string>() { { "status", urlToShare } }; var request = new OAuth1Request(SharedConstants.requestMethodPOST, new Uri("https://api.twitter.com/1.1/statuses/update.json"), dictionaryParameters, twitterAccount); //for testing var request = new OAuth1Request("GET",new Uri("https://api.twitter.com/1.1/account/verify_credentials.json "),null, twitterAccount); request.GetResponseAsync().ContinueWith(this.requestResult); } else { OnShare(this, ShareStatus.NotSuccessful); } }; auth.Error += Auth_Error; //auth.IsUsingNativeUI = true; MainActivity.Instance.StartActivity(auth.GetUI(MainActivity.Instance.ApplicationContext)); } } 
  • ¿El oyente Scrollview no está trabajando en Xamarin para Android?
  • Cambiar el fondo de la actividad del código
  • Mono Android. Marco de pruebas unitarias
  • Asegurar cadena en APK
  • Xamarin ZipAlign no encontrado
  • OnResume Cámara Reinit Negro Pantalla
  • Predeterminación de dlls (.NET 4 framework) problema con mono para android
  • Botón de acción flotante en Xamarin.Forms
  • Xamarin aplicaciones son grandes por qué y pueden ser más pequeños
  • Xamarin construir acción de advertencia XA0101
  • Xamarin android support library v7 y v13 en la misma aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.