Захват снимка экрана Google API для Android API V2
Окончательное обновление
Запрос функции выполнен Google. См. этот ответ ниже.
Оригинальный вопрос
Используя старую версию Android API Google Maps, я смог зафиксировать скриншот карты google для обмена через социальные сети. Я использовал следующий код для захвата снимка экрана и сохранения изображения в файл, и он отлично работал:
public String captureScreen()
{
String storageState = Environment.getExternalStorageState();
Log.d("StorageState", "Storage state is: " + storageState);
// image naming and path to include sd card appending name you choose for file
String mPath = this.getFilesDir().getAbsolutePath();
// create bitmap screen capture
Bitmap bitmap;
View v1 = this.mapView.getRootView();
v1.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);
OutputStream fout = null;
String filePath = System.currentTimeMillis() + ".jpeg";
try
{
fout = openFileOutput(filePath,
MODE_WORLD_READABLE);
// Write the string to the file
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
fout.flush();
fout.close();
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
Log.d("ImageCapture", "FileNotFoundException");
Log.d("ImageCapture", e.getMessage());
filePath = "";
}
catch (IOException e)
{
// TODO Auto-generated catch block
Log.d("ImageCapture", "IOException");
Log.d("ImageCapture", e.getMessage());
filePath = "";
}
return filePath;
}
Однако новый объект GoogleMap, используемый V2 для api, не имеет метода getRootView(), такого как MapView.
Я попытался сделать это:
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.basicMap);
View v1 = mapFragment.getView();
Но скриншот, который я получаю, не имеет никакого содержимого карты и выглядит так:
![Blank Map Screenshot]()
Кто-нибудь понял, как сделать снимок экрана нового API Google Android V2?
Обновление
Я также попытался получить rootView следующим образом:
View v1 = getWindow().getDecorView().getRootView();
Это приводит к скриншоту, который включает панель действий в верхней части экрана, но карта по-прежнему пуста, как прикрепленный снимок экрана.
Обновление
В Google был отправлен запрос функции. Пожалуйста, откройте функцию запроса функции, если это то, что вы хотите добавить в будущем Google: Добавить способность скриншотов к API Карт Google V2
Ответы
Ответ 1
Обновление. Google добавил метод моментальных снимков **!:
Выполнен запрос функции для метода снятия снимка экрана Google Maps API V2 OpenGL на Android.
Чтобы сделать снимок экрана, просто выполните следующий интерфейс:
public abstract void onSnapshotReady (Bitmap snapshot)
и вызовите:
public final void snapshot (GoogleMap.SnapshotReadyCallback callback)
Пример, содержащий скриншот, затем предоставляет стандартные опции "Совместное использование изображений":
public void captureScreen()
{
SnapshotReadyCallback callback = new SnapshotReadyCallback()
{
@Override
public void onSnapshotReady(Bitmap snapshot)
{
// TODO Auto-generated method stub
bitmap = snapshot;
OutputStream fout = null;
String filePath = System.currentTimeMillis() + ".jpeg";
try
{
fout = openFileOutput(filePath,
MODE_WORLD_READABLE);
// Write the string to the file
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
fout.flush();
fout.close();
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
Log.d("ImageCapture", "FileNotFoundException");
Log.d("ImageCapture", e.getMessage());
filePath = "";
}
catch (IOException e)
{
// TODO Auto-generated catch block
Log.d("ImageCapture", "IOException");
Log.d("ImageCapture", e.getMessage());
filePath = "";
}
openShareImageDialog(filePath);
}
};
mMap.snapshot(callback);
}
Как только изображение будет завершено, оно будет запускать стандартное диалоговое окно "Совместное изображение", чтобы пользователь мог выбрать, как они хотели бы поделиться им:
public void openShareImageDialog(String filePath)
{
File file = this.getFileStreamPath(filePath);
if(!filePath.equals(""))
{
final ContentValues values = new ContentValues(2);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
final Uri contentUriFile = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
final Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("image/jpeg");
intent.putExtra(android.content.Intent.EXTRA_STREAM, contentUriFile);
startActivity(Intent.createChooser(intent, "Share Image"));
}
else
{
//This is a custom class I use to show dialogs...simply replace this with whatever you want to show an error message, Toast, etc.
DialogUtilities.showOkDialogWithText(this, R.string.shareImageFailed);
}
}
Документация здесь
Ответ 2
Ниже приведены шаги, чтобы сделать снимок экрана Google Map V2 с примером
Шаг 1. откройте Android Sdk Manager (Window > Android Sdk Manager)
, затем Expand Extras
теперь update/install Google Play Services to Revision 10
проигнорируйте этот шаг, если уже installed
Читать заметки здесь https://developers.google.com/maps/documentation/android/releases#august_2013
Шаг 2. Restart Eclipse
Шаг 3. import com.google.android.gms.maps.GoogleMap.SnapshotReadyCallback;
Шаг 4. Сделайте способ захвата/сохранения экрана/изображения карты, как показано ниже
public void CaptureMapScreen()
{
SnapshotReadyCallback callback = new SnapshotReadyCallback() {
Bitmap bitmap;
@Override
public void onSnapshotReady(Bitmap snapshot) {
// TODO Auto-generated method stub
bitmap = snapshot;
try {
FileOutputStream out = new FileOutputStream("/mnt/sdcard/"
+ "MyMapScreen" + System.currentTimeMillis()
+ ".png");
// above "/mnt ..... png" => is a storage path (where image will be stored) + name of image you can customize as per your Requirement
bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
} catch (Exception e) {
e.printStackTrace();
}
}
};
myMap.snapshot(callback);
// myMap is object of GoogleMap +> GoogleMap myMap;
// which is initialized in onCreate() =>
// myMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map_pass_home_call)).getMap();
}
Шаг 5. Теперь вызовите этот метод CaptureMapScreen()
, где вы хотите захватить изображение
в моем случае я calling this method on Button click in my onCreate()
, который отлично работает
как:
Button btnCap = (Button) findViewById(R.id.btnTakeScreenshot);
btnCap.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
CaptureMapScreen();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
});
Проверьте Doc здесь и здесь
Ответ 3
Изменить: этот ответ больше недействителен - выполнен запрос функции для скриншотов в Google Maps Android API V2. См. этот ответ для примера.
Оригинальный принятый ответ
Поскольку новые карты Android API v2 отображаются с использованием OpenGL, нет возможности создавать скриншот.
Ответ 4
Поскольку верхний проголосовавший ответ не работает с полилиниями и другими надписями поверх фрагмента карты (что я искал), я хочу поделиться этим решением.
public void captureScreen()
{
GoogleMap.SnapshotReadyCallback callback = new GoogleMap.SnapshotReadyCallback()
{
@Override
public void onSnapshotReady(Bitmap snapshot) {
try {
getWindow().getDecorView().findViewById(android.R.id.content).setDrawingCacheEnabled(true);
Bitmap backBitmap = getWindow().getDecorView().findViewById(android.R.id.content).getDrawingCache();
Bitmap bmOverlay = Bitmap.createBitmap(
backBitmap.getWidth(), backBitmap.getHeight(),
backBitmap.getConfig());
Canvas canvas = new Canvas(bmOverlay);
canvas.drawBitmap(snapshot, new Matrix(), null);
canvas.drawBitmap(backBitmap, 0, 0, null);
OutputStream fout = null;
String filePath = System.currentTimeMillis() + ".jpeg";
try
{
fout = openFileOutput(filePath,
MODE_WORLD_READABLE);
// Write the string to the file
bmOverlay.compress(Bitmap.CompressFormat.JPEG, 90, fout);
fout.flush();
fout.close();
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
Log.d("ImageCapture", "FileNotFoundException");
Log.d("ImageCapture", e.getMessage());
filePath = "";
}
catch (IOException e)
{
// TODO Auto-generated catch block
Log.d("ImageCapture", "IOException");
Log.d("ImageCapture", e.getMessage());
filePath = "";
}
openShareImageDialog(filePath);
} catch (Exception e) {
e.printStackTrace();
}
}
};
;
map.snapshot(callback);
}
Ответ 5
Eclipse DDMS может захватывать экран даже на карте google V2.
Попробуйте вызвать /system/bin/screencap или/system/bin/screenshot, если у вас есть "root". Я узнал, что из как ECDS и Android DDMS реализуют "захват экрана"