Android tomar la captura de pantalla y compartirla
Hey Estoy tratando de agregar un botón de compartir a mi aplicación que toma la captura de pantalla y luego compartir ist a través de facebook, etc Tenía la búsqueda de la red para que stackoverflow también hay muchos hilos relacionados con este problema, pero no podía imaginar que todavía. Lo que me confunde es .. En cada ejemplo las imágenes de filepath hardcoded me gustó eso pero no es útil y dinámico, lo que estoy tratando de hacer es tomar la captura de pantalla de ese momento y luego compartirlo .. Pero cuando doy El filepath por mí mismo sólo toma esa imagen de una carpeta y compartir que
public void clickButton(View v) { Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND); //set the type shareIntent.setType("image/png"); //add a subject shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "CAR EXAMPLE"); //build the body of the message to be shared String shareMessage = "An app..."; //add the message shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareMessage); //add the img shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("/storage/sdcard0/Tutorial_ScreenShot/screenshot0.jpg")); //start the chooser for sharing startActivity(Intent.createChooser(shareIntent, "Share")); }
Como se puede ver en la parte de agregar la imagen que doy el filepath por mí mismo. Así que cómo dar un comportamiento más dinámico a eso. Quiero decir cuando hago clic en el botón de la pantalla de mi aplicación tiene que ser guardado en una carpeta y luego puedo compartir eso sin hardcoding filepath .. Cualquier ayuda sería grande
- Emulador de Android muestra la pantalla de inicio invertida reflejada y bloqueada (¿por qué?)
- Android: imageSwitcher encaja en la pantalla
- Ratio de pantalla de Android
- Tamaños y densidades de pantalla Android
- Cómo comprobar si mi aplicación es el iniciador predeterminado
Editado después de probar la solución a continuación;
bien gracias. He llamado shareIt () justo debajo onClick de un botón y la aplicación se detiene .. aquí es el registro.
12-28 15:53:01.660: E/AndroidRuntime(14120): FATAL EXCEPTION: main 12-28 15:53:01.660: E/AndroidRuntime(14120): Process: com.hede.namesurfer, PID: 14120 12-28 15:53:01.660: E/AndroidRuntime(14120): java.lang.NullPointerException 12-28 15:53:01.660: E/AndroidRuntime(14120): at com.hede.namesurfer.MainActivity.share(MainActivity.java:161) 12-28 15:53:01.660: E/AndroidRuntime(14120): at com.hede.namesurfer.MainActivity$1.onClick(MainActivity.java:42) 12-28 15:53:01.660: E/AndroidRuntime(14120): at android.view.View.performClick(View.java:4438) 12-28 15:53:01.660: E/AndroidRuntime(14120): at android.view.View$PerformClick.run(View.java:18422) 12-28 15:53:01.660: E/AndroidRuntime(14120): at android.os.Handler.handleCallback(Handler.java:733) 12-28 15:53:01.660: E/AndroidRuntime(14120): at android.os.Handler.dispatchMessage(Handler.java:95) 12-28 15:53:01.660: E/AndroidRuntime(14120): at android.os.Looper.loop(Looper.java:136) 12-28 15:53:01.660: E/AndroidRuntime(14120): at android.app.ActivityThread.main(ActivityThread.java:5017) 12-28 15:53:01.660: E/AndroidRuntime(14120): at java.lang.reflect.Method.invokeNative(Native Method) 12-28 15:53:01.660: E/AndroidRuntime(14120): at java.lang.reflect.Method.invoke(Method.java:515) 12-28 15:53:01.660: E/AndroidRuntime(14120): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 12-28 15:53:01.660: E/AndroidRuntime(14120): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 12-28 15:53:01.660: E/AndroidRuntime(14120): at dalvik.system.NativeStart.main(Native Method) 12-28 15:53:02.780: I/Process(14120): Sending signal. PID
- Tamaños extraíbles de los androides cambia en la pantalla al leer la imagen del archivo
- Android, IOS fuerza presionando en la pantalla
- Android cómo dividir entre dos textview el ancho completo de pantalla exactamente cincuenta por ciento cincuenta?
- El selector de inicio de Android / lanzador no muestra la opción "usar de forma predeterminada para esta acción"
- ¿Cuándo se desactiva exactamente el servicio NFC?
- Android Development: Cambio del brillo de la pantalla en el servicio
- screen.width + android
- Cómo obtener el tamaño total de la pantalla en un dispositivo android programaticamente
Prueba esto
public void shareit() { View view = findViewById(R.id.layout);//your layout id view.getRootView(); String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { File picDir = new File(Environment.getExternalStorageDirectory()+ "/myPic"); if (!picDir.exists()) { picDir.mkdir(); } view.setDrawingCacheEnabled(true); view.buildDrawingCache(true); Bitmap bitmap = view.getDrawingCache(); // Date date = new Date(); String fileName = "mylove" + ".jpg"; File picFile = new File(picDir + "/" + fileName); try { picFile.createNewFile(); FileOutputStream picOut = new FileOutputStream(picFile); bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), (int)(bitmap.getHeight()/1.2)); boolean saved = bitmap.compress(CompressFormat.JPEG, 100, picOut); if (saved) { Toast.makeText(getApplicationContext(), "Image saved to your device Pictures "+ "directory!", Toast.LENGTH_SHORT).show(); } else { //Error } picOut.close(); } catch (Exception e) { e.printStackTrace(); } view.destroyDrawingCache(); } else { //Error } Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); sharingIntent.setType("image/jpeg"); sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(picFile.getAbsolutePath())); startActivity(Intent.createChooser(sharingIntent, "Share via")); }
Para screeshot
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 agregue estos métodos al hacer clic
shareScoreCatch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Bitmap bitmap = takeScreenshot(); saveBitmap(bitmap); shareIt(); } });
Y en manifiesto
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Intenta agregar a tu archivo de manifiesto la línea
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Para cualquier persona que pueda necesitar una solución a esto en el futuro, esto es lo que uso en mis aplicaciones. Probado y funcionando en Android 4.0 a 7.1.
Primero, defina la variable para la pantalla visible en su Actividad:
public View preView;
A continuación, inicie la vista para permitir una captura de pantalla:
preView = getWindow().getDecorView();
A continuación, puede llamar al siguiente método dentro de su Actividad al hacer clic en un botón. Coloco este método en una clase sin cabeza y lo referencia como sea necesario.
public static void takeScreenShotAndShare(final Context context, View view, boolean incText, String text){ try{ File mPath = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "screenshot.png"); //File imageDirectory = new File(mPath, "screenshot.png"); view.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache()); view.setDrawingCacheEnabled(false); FileOutputStream fOut = new FileOutputStream(mPath); int quality = 100; bitmap.compress(Bitmap.CompressFormat.PNG, quality, fOut); fOut.flush(); fOut.close(); final Intent shareIntent = new Intent(Intent.ACTION_SEND); Uri pictureUri = Uri.fromFile(mPath); shareIntent.setType("image/*"); if(incText){ shareIntent.putExtra(Intent.EXTRA_TEXT, text); } shareIntent.putExtra(Intent.EXTRA_STREAM, pictureUri); shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); context.startActivity(Intent.createChooser(shareIntent, "Share image using")); }catch (Throwable tr){ Log.d(TAG, "Couldn't save screenshot", tr); } }