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".
- Android ListView con CursorAdapter tiene la posición de desplazamiento incorrecta después de Requery se llama cuando se agregan nuevos elementos
- Xamarin apk en Blackberry (> = 10.2.1)
- ¿Por qué no se construirá mi proyecto Xamarin.Android con Proguard habilitado: "java.exe" salió con el código 1
- Mono para Android - ¿Cómo funciona?
- ¿Incompatibilidades de la capa de servicio MonoTouch / MonoDroid?
¿Puedes señalarme lo que estoy haciendo mal?
- Cómo determinar el tipo MIME de archivo en android?
- MonoDroid: Error al llamar al constructor de la vista personalizada - TwoDScrollView
- HttpClient - Xamarin Android - MvvmCross
- No puede convertir implícitamente tipo 'System.IO.Stream' a 'Java.IO.InputStream'
- Android Analyze APK
- Cuadro de mensaje para android mono
- ¿Cómo detectar la salida de la aplicación en android?
- Xamarin AndroidManifest.xml es diferente al de Visual Studio
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)); } }
- Copia de la aplicación de escritorio java y transferencia de datos de android a través de USB
- Android Studio "No hay dispositivos conectados" HTC One (M7)