una tomar samsung pantalla moto hacer como celular captura android android-studio share screenshot

android - samsung - ¿Cómo tomar una captura de pantalla de la actividad actual y luego compartirla?



como hacer una captura de pantalla en el celular (10)

Necesito tomar una captura de pantalla de la Activity (sin la barra de título, y el usuario NO debe ver que se ha tomado una captura de pantalla) y luego compartirla a través de un botón del menú de acción "compartir". Ya he intentado algunas soluciones, pero no funcionaron para mí. ¿Algunas ideas?


Ahorre tiempo y use esta biblioteca de Android

¿Por qué debería usar InstaCapture?

  1. Captura todo el contenido en la pantalla de su aplicación y evita:

    • Captura de pantalla negra para vistas como: Google Maps (MapView, SupportMapFragment), TextureView, GLSurfaceView

    • Vistas perdidas como: cuadros de diálogo, menús contextuales, tostadas

  2. Establezca una vista específica para evitar que se capture.

  3. No se requieren permisos.


Así es como capturé la pantalla y la compartí. Echa un vistazo si estás interesado.

public Bitmap takeScreenshot() { View rootView = findViewById(android.R.id.content).getRootView(); rootView.setDrawingCacheEnabled(true); return rootView.getDrawingCache(); }

Y el método que guarda la imagen de mapa de bits en almacenamiento externo:

public void saveBitmap(Bitmap bitmap) { File imagePath = new File(Environment.getExternalStorageDirectory() + "/screenshot.png"); FileOutputStream fos; try { fos = new FileOutputStream(imagePath); bitmap.compress(CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); } catch (FileNotFoundException e) { Log.e("GREC", e.getMessage(), e); } catch (IOException e) { Log.e("GREC", e.getMessage(), e); }}

ver más en: https://www.youtube.com/watch?v=LRCRNvzamwY&feature=youtu.be


Así es como capturé la pantalla y la compartí.

Primero , obtenga la vista raíz de la actividad actual:

View rootView = getWindow().getDecorView().findViewById(android.R.id.content);

En segundo lugar , capture la vista de raíz:

public static Bitmap getScreenShot(View view) { View screenView = view.getRootView(); screenView.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache()); screenView.setDrawingCacheEnabled(false); return bitmap; }

En tercer lugar , almacene el Bitmap en la tarjeta SD:

public static void store(Bitmap bm, String fileName){ final static String dirPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Screenshots"; File dir = new File(dirPath); if(!dir.exists()) dir.mkdirs(); File file = new File(dirPath, fileName); try { FileOutputStream fOut = new FileOutputStream(file); bm.compress(Bitmap.CompressFormat.PNG, 85, fOut); fOut.flush(); fOut.close(); } catch (Exception e) { e.printStackTrace(); } }

Por último , comparta la captura de pantalla de la Activity actual:

private void shareImage(File file){ Uri uri = Uri.fromFile(file); Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND); intent.setType("image/*"); intent.putExtra(android.content.Intent.EXTRA_SUBJECT, ""); intent.putExtra(android.content.Intent.EXTRA_TEXT, ""); intent.putExtra(Intent.EXTRA_STREAM, uri); try { startActivity(Intent.createChooser(intent, "Share Screenshot")); } catch (ActivityNotFoundException e) { Toast.makeText(context, "No App Available", Toast.LENGTH_SHORT).show(); } }

Espero que te inspiren mis códigos.

ACTUALIZAR:

Agregue los permisos a continuación en su AndroidManifest.xml :

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Porque crea y accede a los archivos en el almacenamiento externo.

ACTUALIZAR:

A partir de Android 7.0 Los enlaces de archivos de uso compartido de turrones están prohibidos. Para tratar con esto, debe implementar FileProvider y compartir "content: //" uri not "file: //" uri.

Here hay una buena descripción de cómo hacerlo.


Esto es lo que uso para tomar una captura de pantalla. Las soluciones descritas anteriormente funcionan bien para API <24, pero para API 24 y más se necesita otra solución. He probado este método en API 15, 24 y 27.

Puse los siguientes métodos en MainActivity.java:

public class MainActivity { ... String[] permissions = new String[]{"android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE"}; View sshotView; ... private boolean checkPermission() { List arrayList = new ArrayList(); for (String str : this.permissions) { if (ContextCompat.checkSelfPermission(this, str) != 0) { arrayList.add(str); } } if (arrayList.isEmpty()) { return true; } ActivityCompat.requestPermissions(this, (String[]) arrayList.toArray(new String[arrayList.size()]), 100); return false; } protected void onCreate(Bundle savedInstanceState) { ... this.sshotView = getWindow().getDecorView().findViewById(R.id.parent); ... } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.action_shareScreenshot: boolean checkPermission = checkPermission(); Bitmap screenShot = getScreenShot(this.sshotView); if (!checkPermission) { return true; } shareScreenshot(store(screenShot)); return true; case R.id.option2: ... return true; } return false; } private void shareScreenshot(File file) { Parcelable fromFile = FileProvider.getUriForFile(MainActivity.this, BuildConfig.APPLICATION_ID + ".com.redtiger.applehands.provider", file); Intent intent = new Intent(); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setAction("android.intent.action.SEND"); intent.setType("image/*"); intent.putExtra("android.intent.extra.SUBJECT", XmlPullParser.NO_NAMESPACE); intent.putExtra("android.intent.extra.TEXT", XmlPullParser.NO_NAMESPACE); intent.putExtra("android.intent.extra.STREAM", fromFile); try { startActivity(Intent.createChooser(intent, "Share Screenshot")); } catch (ActivityNotFoundException e) { Toast.makeText(getApplicationContext(), "No Communication Platform Available", Toast.LENGTH_SHORT).show(); } } public static Bitmap getScreenShot(View view) { View rootView = view.getRootView(); rootView.setDrawingCacheEnabled(true); Bitmap createBitmap = Bitmap.createBitmap(rootView.getDrawingCache()); rootView.setDrawingCacheEnabled(false); return createBitmap; public File store(Bitmap bitmap) { String str = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Screenshots"; File file = new File(str); if (!file.exists()) { file.mkdirs(); } file = new File(str + "/sshot.png"); try { OutputStream fileOutputStream = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.PNG, 80, fileOutputStream); fileOutputStream.flush(); fileOutputStream.close(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "External Storage Permission Is Required", Toast.LENGTH_LONG).show(); } return file; } }

Puse los siguientes permisos y proveedor en mi AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.redtiger.applehands"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <application ... <provider android:name="com.redtiger.applehands.util.GenericFileProvider" android:authorities="${applicationId}.com.redtiger.applehands.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider> ... </application> </manifest>

Creé un archivo llamado provider_paths.xml (ver más abajo) para dirigir FileProvider donde guardar la captura de pantalla. El archivo contiene una etiqueta simple que apunta a la raíz del directorio externo.

El archivo se colocó en la carpeta de recursos res / xml (si no tiene una carpeta xml aquí, simplemente cree una y coloque su archivo allí).

provider_paths.xml:

<?xml version="1.0" encoding="utf-8"?> <paths> <external-path name="external_files" path="."/> </paths>


No pude obtener la respuesta de Silent Knight para trabajar hasta que agregue

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

a mi AndroidManifest.xml .


Para todos los usuarios de Xamarin:

Xamarin.Código de Android:

Crear una clase externa (tengo una interfaz para cada plataforma, e implementé esas 3 funciones a continuación desde la plataforma de Android):

public static Bitmap TakeScreenShot(View view) { View screenView = view.RootView; screenView.DrawingCacheEnabled = true; Bitmap bitmap = Bitmap.CreateBitmap(screenView.DrawingCache); screenView.DrawingCacheEnabled = false; return bitmap; } public static Java.IO.File StoreScreenShot(Bitmap picture) { var folder = Android.OS.Environment.ExternalStorageDirectory + Java.IO.File.Separator + "MyFolderName"; var extFileName = Android.OS.Environment.ExternalStorageDirectory + Java.IO.File.Separator + Guid.NewGuid() + ".jpeg"; try { if (!Directory.Exists(folder)) Directory.CreateDirectory(folder); Java.IO.File file = new Java.IO.File(extFileName); using (var fs = new FileStream(extFileName, FileMode.OpenOrCreate)) { try { picture.Compress(Bitmap.CompressFormat.Jpeg, 100, fs); } finally { fs.Flush(); fs.Close(); } return file; } } catch (UnauthorizedAccessException ex) { Log.Error(LogPriority.Error.ToString(), "-------------------" + ex.Message.ToString()); return null; } catch (Exception ex) { Log.Error(LogPriority.Error.ToString(), "-------------------" + ex.Message.ToString()); return null; } } public static void ShareImage(Java.IO.File file, Activity activity, string appToSend, string subject, string message) { //Push to Whatsapp to send Android.Net.Uri uri = Android.Net.Uri.FromFile(file); Intent i = new Intent(Intent.ActionSendMultiple); i.SetPackage(appToSend); // so that only Whatsapp reacts and not the chooser i.AddFlags(ActivityFlags.GrantReadUriPermission); i.PutExtra(Intent.ExtraSubject, subject); i.PutExtra(Intent.ExtraText, message); i.PutExtra(Intent.ExtraStream, uri); i.SetType("image/*"); try { activity.StartActivity(Intent.CreateChooser(i, "Share Screenshot")); } catch (ActivityNotFoundException ex) { Toast.MakeText(activity.ApplicationContext, "No App Available", ToastLength.Long).Show(); } }`

Ahora, desde tu Actividad, ejecutas el código anterior de esta manera:

RunOnUiThread(() => { //take silent screenshot View rootView = Window.DecorView.FindViewById(Resource.Id.ActivityLayout); Bitmap tmpPic = ShareHandler.TakeScreenShot(this.CurrentFocus); //TakeScreenShot(this); Java.IO.File imageSaved = ShareHandler.StoreScreenShot(tmpPic); if (imageSaved != null) { ShareHandler.ShareImage(imageSaved, this, "com.whatsapp", "", "ScreenShot Taken from: " + "Somewhere"); } });

Espero que sea de utilidad para cualquiera.


Puede obtener el código de abajo para obtener el mapa de bits de la vista que está viendo en la pantalla Puede especificar qué vista crear mapa de bits.

public static Bitmap getScreenShot(View view) { View screenView = view.getRootView(); screenView.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache()); screenView.setDrawingCacheEnabled(false); return bitmap; }


Puede tomar una captura de pantalla de cualquier parte de su vista. Solo necesita la referencia del diseño cuya captura de pantalla desea. por ejemplo, en tu caso, quieres la captura de pantalla de tu actividad. supongamos que el diseño de la raíz de la actividad es Diseño lineal.

// find the reference of the layout which screenshot is required LinearLayout LL = (LinearLayout) findViewById(R.id.yourlayout); Bitmap screenshot = getscreenshot(LL); //use this method to get the bitmap private Bitmap getscreenshot(View view) { View v = view; v.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(v.getDrawingCache()); return bitmap; }


crear botón compartir con clic en oyente

share = (Button)findViewById(R.id.share); share.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Bitmap bitmap = takeScreenshot(); saveBitmap(bitmap); shareIt(); } });

Agregue dos métodos

public Bitmap takeScreenshot() { View rootView = findViewById(android.R.id.content).getRootView(); rootView.setDrawingCacheEnabled(true); return rootView.getDrawingCache(); } public void saveBitmap(Bitmap bitmap) { imagePath = new File(Environment.getExternalStorageDirectory() + "/screenshot.png"); FileOutputStream fos; try { fos = new FileOutputStream(imagePath); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); } catch (FileNotFoundException e) { Log.e("GREC", e.getMessage(), e); } catch (IOException e) { Log.e("GREC", e.getMessage(), e); } }

Compartir captura de pantalla. compartiendo la implementación aquí

private void shareIt() { Uri uri = Uri.fromFile(imagePath); Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); sharingIntent.setType("image/*"); String shareBody = "In Tweecher, My highest score with screen shot"; sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "My Tweecher score"); sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody); sharingIntent.putExtra(Intent.EXTRA_STREAM, uri); startActivity(Intent.createChooser(sharingIntent, "Share via")); }


para tomar una captura de pantalla

public Bitmap takeScreenshot() { View rootView = findViewById(android.R.id.content).getRootView(); rootView.setDrawingCacheEnabled(true); return rootView.getDrawingCache(); }

para guardar la captura de pantalla

private void saveBitmap(Bitmap bitmap) { imagePath = new File(Environment.getExternalStorageDirectory() + "/scrnshot.png"); ////File imagePath FileOutputStream fos; try { fos = new FileOutputStream(imagePath); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); } catch (FileNotFoundException e) { Log.e("GREC", e.getMessage(), e); } catch (IOException e) { Log.e("GREC", e.getMessage(), e); } }

y para compartir

private void shareIt() { Uri uri = Uri.fromFile(imagePath); Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); sharingIntent.setType("image/*"); String shareBody = "My highest score with screen shot"; sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "My Catch score"); sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody); sharingIntent.putExtra(Intent.EXTRA_STREAM, uri); startActivity(Intent.createChooser(sharingIntent, "Share via")); }

y simplemente en el onclick puede llamar a estos métodos

shareScoreCatch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Bitmap bitmap = takeScreenshot(); saveBitmap(bitmap); shareIt(); } });