Подтвердить что ты не робот

Захват снимка экрана 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

4b9b3361

Ответ 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);
        }