Intereting Posts
Как развить расширяющийся вид с фиксированным видом соотношения сторон Модуль библиотеки Android Studio Java и модуль библиотеки Android Используйте несколько учетных записей firebase в одном приложении для Android для Google Analytics Как я могу установить TextColor, TextSize из PagerTitleStrip из кода? Глобальная переменная Android Ориентация видеомагнитофона JavaCV не подходит в портретном режиме Использование intelliJ с gradle OFFLINE для разработки android Использование функции «подстановочные знаки» в Android.mk Как я могу форматировать двойной с помощью привязки данных Android? Множество TypeFace в одиночном TextView Android.widget.TextView не может быть добавлен в android.view.ViewGroup Запрос пользователя оценить / просмотреть / комментировать Android Маркет Использование активной панели действий поддержки Получение «Неизвестного приложения ABI» при попытке отладки кода C в приложении для Android Android: внутренняя кнопка просмотра изображения

Как сделать снимок экрана текущей деятельности, а затем поделиться ею?

Мне нужно сделать снимок экрана Activity (без строки заголовка, и пользователь НЕ должен видеть, что снимок экрана действительно был взят), а затем поделиться им с помощью кнопки меню действий «share». Я уже пробовал некоторые решения, но они не работали для меня. Есть идеи?

Solutions Collecting From Web of "Как сделать снимок экрана текущей деятельности, а затем поделиться ею?"

Вот как я захватил экран и поделился им. Посмотрите, если вы заинтересованы.

Во-первых , получить корневой вид из текущей активности:

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

Во-вторых , захватите корневой режим:

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

В-третьих , сохраните Bitmap в SDCard:

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

Наконец , поделитесь снимком экрана текущей Activity :

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

Надеюсь, вы будете вдохновлены моими кодами.

ОБНОВИТЬ:

Добавьте ниже разрешения в свой AndroidManifest.xml :

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

Потому что он создает и обращается к файлам во внешнем хранилище.

Вы можете использовать приведенный ниже код для получения растрового изображения для просмотра, которое вы видите на экране. Вы можете указать, какое представление для создания растрового изображения.

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

Создать кнопку совместного доступа с кликом на прослушиватель

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

Добавьте два метода

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

Поделиться снимок экрана. Совместное использование здесь

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

Я не мог получить ответ Silent Knight, чтобы работать, пока не добавил

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

На мой AndroidManifest.xml .

Вы можете сделать снимок экрана любой части вашего вида. Вам просто нужна ссылка на макет, который вы хотите снять с экрана. Например, в вашем случае вам нужен снимок экрана вашей активности. Допустим, что ваш корневой макет активности – это линейная компоновка.

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

Вот как я захватил экран и поделился им. Посмотрите, если вы заинтересованы.

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

И метод, который сохраняет растровое изображение во внешнем хранилище:

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

Подробнее см .: https://www.youtube.com/watch?v=LRCRNvzamwY&feature=youtu.be

Для всех пользователей Xamarin:

Xamarin.Android Код:

Создайте внешний класс (у меня есть интерфейс для каждой платформы, и я реализовал эти 3 функции ниже с платформы 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(); } }` 

Теперь из вашей операции вы запускаете приведенный выше код следующим образом:

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

Надеюсь, это будет полезно для всех.

Для screeshot

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

Для сохранения снимка экрана

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

И для обмена

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

И простота onclick вы можете назвать эти методы

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

Сохраните свое время и используйте эту андроидную библиотеку