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

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 

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); } } 
  • GetLocationOnScreen () vs getLocationInWindow ()
  • Android: apaga la pantalla sin entrar en el modo Standby
  • Pantalla de bloqueo personalizada para Android
  • Detectar una tableta de 7 pulgadas y 10 pulgadas mediante programación
  • cómo puedo obtener el tamaño real de la pantalla cuando una aplicación se ejecuta en modo de compatibilidad
  • Visualización compartida de Android en otros dispositivos
  • Cómo evitar la captura de pantalla en Android
  • Captura de pantalla del código
  • Cómo comprobar si mi actividad es la actividad actual que se ejecuta en la pantalla
  • Android: ¿Cómo obtener información si la pantalla pasa al modo de atenuación?
  • Cómo crear una pantalla deslizante (como en Tweetdeck) en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.