51

最終更新

機能のリクエストは Google によって実現されました。以下のこの回答を参照してください。

元の質問

古いバージョンの Google Maps Android API を使用して、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;
}

ただし、API の V2 で使用される新しい GoogleMap オブジェクトには、MapView のような「getRootView()」メソッドがありません。

私はこれをやろうとしました:

    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.basicMap);

    View v1 = mapFragment.getView();

しかし、取得したスクリーンショットにはマップ コンテンツがなく、次のようになります。 空白の地図のスクリーンショット

新しい Google Maps Android API V2 のスクリーンショットを撮る方法を見つけた人はいますか?

アップデート

また、この方法で rootView を取得しようとしました:

View v1 = getWindow().getDecorView().getRootView();

これにより、画面上部にアクション バーを含むスクリーンショットが作成されますが、添付したスクリーンショットのようにマップは空白のままです。

アップデート

機能リクエストが Google に送信されました。今後 Google に追加してほしい機能がある場合は、機能リクエストにスターを付けてください 。Google Maps API V2 にスクリーンショット機能を追加します。

4

9 に答える 9

66

更新 - Google はスナップショット メソッドを追加しました**!:

Android Google Map API V2 OpenGL レイヤーのスクリーン ショットを取得するメソッドの機能要求が満たされました。

スクリーンショットを撮るには、次のインターフェイスを実装するだけです。

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

ドキュメントはこちら

于 2013-08-07T01:41:45.637 に答える
30

以下は、例を使用して Google マップ V2 のスクリーン ショットをキャプチャする手順です。

ステップ 1.開いてAndroid Sdk Manager (Window > Android Sdk Manager)から、このステップを無視します (既にある場合) Expand Extrasupdate/install Google Play Services to Revision 10installed

ここでメモを読むhttps://developers.google.com/maps/documentation/android/releases#august_2013

ステップ2。 Restart Eclipse

ステップ 3。 import com.google.android.gms.maps.GoogleMap.SnapshotReadyCallback;

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

        }
    });

ここここでドキュメントを確認してください

于 2013-08-19T07:34:43.300 に答える
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);
        }
于 2015-07-16T03:29:12.930 に答える
4

編集: この回答は無効になりました - Google Maps Android API V2 でのスクリーンショットの機能要求は満たされました。例については、この回答を参照してください。

元の受け入れられた回答

新しい Android API v2 マップは OpenGL を使用して表示されるため、スクリーンショットを作成することはできません。

于 2012-12-10T13:13:44.790 に答える
-2

Eclipse DDMS は、Google マップ V2 でも画面をキャプチャできます。

「ルート」がある場合は、/system/bin/screencap または /system/bin/screenshot を呼び出してみてください。Eclipse android DDMSが「スクリーンキャプチャ」を実装する方法からそれを学びました

于 2013-02-06T09:01:22.490 に答える