web-dev-qa-db-ja.com

プレースピッカーアクティビティからマップのスナップショットを取得するにはどうすればよいですか?

Googleマップから場所を選び、その住所をデータベースに保存するアプリを作成しています。また、選択した場所のスナップショットをストレージに保存して、対応するスナップショットとともにデータを表示できるようにします。

マップから場所を選択すると、place-pickerアクティビティに次のダイアログが表示されます。

enter image description here

このダイアログには、住所、緯度、経度、およびスナップショットも表示されます。私は住所と緯度を取得する方法を知っています。しかし、表示されたスナップショットを保存する方法がわかりません。

その画像以外のすべてを取得する私のメソッドは次のとおりです。

  //opening place picker activity.
protected void onActivityResult(int requestCode,
                                int resultCode, Intent data) {

    if (requestCode == PLACE_PICKER_REQUEST
            && resultCode == Activity.RESULT_OK) {

        final Place place = PlacePicker.getPlace(this, data);
        final CharSequence name = place.getName();
        final CharSequence address = place.getAddress();

        String attributions = (String) place.getAttributions();
        if (attributions == null) {
            attributions = "";
        }
        tv4.setText(place.getLatLng().toString()+"\n"+name+"\n"+address+"\n"+attributions);


    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }
}

画像を取得して外部ストレージまたは内部ストレージに保存する方法がわかりません。出来ますか? このリンク? で説明されているようにスナップショットを撮る必要があります

[〜#〜]編集[〜#〜]

プレイスピッカーのアクティビティを呼び出す次のアクティビティがあります。

Main2Activity.Java:

import Android.app.Activity;
import Android.app.AlertDialog;
import Android.content.Intent;
import Android.graphics.Bitmap;
import Android.net.Uri;
import Android.os.Bundle;
 import Android.os.Environment;
import Android.support.v4.app.NavUtils;
import Android.support.v7.app.AppCompatActivity;
import Android.support.v7.widget.Toolbar;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.view.View;
import Android.widget.Button;
import Android.widget.TextView;
import com.google.Android.gms.common.GooglePlayServicesNotAvailableException;
import  com.google.Android.gms.common.GooglePlayServicesRepairableException;
import com.google.Android.gms.common.api.GoogleApiClient;
import com.google.Android.gms.location.places.Place;
import com.google.Android.gms.location.places.ui.PlacePicker;
import com.google.Android.gms.maps.GoogleMap;
import com.google.Android.gms.maps.MapFragment;
import com.google.Android.gms.maps.model.LatLng;
import com.google.Android.gms.maps.model.LatLngBounds;
import Android.database.Cursor;
import Android.widget.EditText;
import Android.widget.Toast;
import com.google.Android.gms.maps.OnMapReadyCallback;

import Java.io.File;
import Java.io.FileOutputStream;
import Java.util.Date;


public class Main2Activity extends AppCompatActivity implements OnMapReadyCallback{
private static final int PLACE_PICKER_REQUEST = 1;
private TextView mName;
private TextView mAddress;
private TextView mAttributions;
private GoogleApiClient mGoogleApiClient;
public TextView tv4;
private static final LatLngBounds BOUNDS_MOUNTAIN_VIEW = new LatLngBounds(
        new LatLng(37.398160, -122.180831), new LatLng(37.430610, -121.972090));

private Toolbar toolbar;
private GoogleMap mMap;
private boolean flag = false;
DatabaseHelper myDb;
EditText newevent;
Button submit;
Button viewremainders;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);


    MapFragment mapFragment = (MapFragment) getFragmentManager() .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);



    myDb =new DatabaseHelper(this);
    newevent=(EditText)findViewById(R.id.newEvent);
    submit=(Button)findViewById(R.id.submit);
    viewremainders=(Button)findViewById(R.id.view);

    toolbar = (Toolbar)findViewById(R.id.app_bar0);
    setSupportActionBar(toolbar);

    getSupportActionBar().setHomeButtonEnabled(true);          //for back button to main activity.
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    Button pickerButton = (Button) findViewById(R.id.pickerButton);
    tv4 = (TextView)findViewById(R.id.textView4);
    pickerButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                PlacePicker.IntentBuilder intentBuilder =
                        new PlacePicker.IntentBuilder();
                intentBuilder.setLatLngBounds(BOUNDS_MOUNTAIN_VIEW);
                Intent intent = intentBuilder.build(Main2Activity.this);
                startActivityForResult(intent, PLACE_PICKER_REQUEST);


            } catch (GooglePlayServicesRepairableException
                    | GooglePlayServicesNotAvailableException e) {
                e.printStackTrace();
            }
        }
    });

    AddData();
    viewremainders();
}

@Override
public void onMapReady(GoogleMap map) {


    mMap = map;
}

//method for adding data in Database.
public void AddData(){
    submit.setOnClickListener(
            new View.OnClickListener(){
                @Override
                public void onClick(View v){
                    boolean isInserted =myDb.insertData(newevent.getText().toString(),tv4.getText().toString());
                    if(isInserted==true)
                        Toast.makeText(Main2Activity.this,"Data Inserted",Toast.LENGTH_LONG).show();
                    else
                        Toast.makeText(Main2Activity.this,"Data not Inserted",Toast.LENGTH_LONG).show();

                }
            }
    );
}

//Method for view all data from database.
public void viewremainders(){
    viewremainders.setOnClickListener(
            new View.OnClickListener(){
                @Override
                public void onClick(View v){
                    Cursor res= myDb.getAllData();
                    if(res.getCount()==0)
                    {
                        Showmessage("Error","No remainders found");
                        return;
                    }
                    StringBuffer buffer=new StringBuffer();
                    while(res.moveToNext())
                    {
                        buffer.append("Id : " +res.getString(0)+"\n");
                        buffer.append("Event : " +res.getString(1)+"\n");
                        buffer.append("Location : " +res.getString(2)+"\n");
                    }
                    Showmessage("Data",buffer.toString());

                }



            }
    );
}

public void Showmessage(String title,String message)
{
    AlertDialog.Builder builder=new AlertDialog.Builder(this);
    builder.setCancelable(true);
    builder.setTitle(title);
    builder.setMessage(message);
    builder.show();
}


//opening place picker activity.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {


    if (requestCode == PLACE_PICKER_REQUEST
            && resultCode == Activity.RESULT_OK) {

        final Place place = PlacePicker.getPlace(this, data);
        final CharSequence name = place.getName();
        final CharSequence address = place.getAddress();



        String attributions = (String) place.getAttributions();
        if (attributions == null) {
            attributions = "";
        }
     //   tv4.setText(place.getLatLng().toString()+"\n"+name+"\n"+address+"\n"+attributions);  To get latitide and longitudes.
        tv4.setText(address+"\n"+attributions);





   /*     LatLngBounds selectedPlaceBounds = PlacePicker.getLatLngBounds(data);
        // move camera to selected bounds
        CameraUpdate camera = CameraUpdateFactory.newLatLngBounds(selectedPlaceBounds,0);
        mMap.moveCamera(camera);

        // take snapshot and implement the snapshot ready callback
        mMap.snapshot(new GoogleMap.SnapshotReadyCallback() {
            Bitmap bitmap=null;
            public void onSnapshotReady(Bitmap snapshot) {
                // handle snapshot here
                bitmap = snapshot;
                try {
                    FileOutputStream out = new FileOutputStream(Environment.getExternalStorageDirectory().toString()+"/ing.png");
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
                    Toast.makeText(Main2Activity.this,"dsfds",Toast.LENGTH_LONG).show();
                } catch (Exception e) {
                    Toast.makeText(Main2Activity.this,e.toString(),Toast.LENGTH_SHORT).show();
                    e.printStackTrace();
                }
            }
        });*/



    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }
}


private void capture(){
    try {
        // image naming and path  to include sd card  appending name you choose for file
        String mPath = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_MOVIES).toString();

        // create bitmap screen capture
        View v1 = getWindow().getDecorView().getRootView();
        v1.setDrawingCacheEnabled(true);
        Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache());
        v1.setDrawingCacheEnabled(false);

        File imageFile = new File(Environment.getExternalStorageDirectory().toString()+"/"+"lllll.jpg");

        FileOutputStream outputStream = new FileOutputStream(imageFile);
        int quality = 100;
        bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
        outputStream.flush();
        outputStream.close();

        openScreenshot(imageFile);
    } catch (Throwable e) {
        // Several error may come out with file handling or OOM
        e.printStackTrace();
    }
}


private void openScreenshot(File imageFile) {
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    Uri uri = Uri.fromFile(imageFile);
    intent.setDataAndType(uri, "image/*");
    startActivity(intent);
}

//Methods for toolbar


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main2, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    if(id == Android.R.id.home){
        NavUtils.navigateUpFromSameTask(this);
    }

    return super.onOptionsItemSelected(item);
}
}

enter image description hereenter image description here

26
user6649667

長い座標と緯度の座標を取得できるため、GoogleマップAPIを使用して地図画像を取得できます。

例とドキュメントへのリンクは次のとおりです。

https://developers.google.com/maps/documentation/static-maps/intro

これがダイアログがバックグラウンドで実行していることだと思います。

それが機能しない場合、またはより正確なものが必要な場合は、Wiresharkを使用して、送受信されているデータを正確に監視することをお勧めします。

私はあなたの地図の場所とこのURLでテストを実行しました:

https://maps.googleapis.com/maps/api/staticmap?center=37.430610,%20-121.972090&zoom=17&size=400x400&key=[myAPIKey]

私はこの画像を手に入れました:

enter image description here

ダイアログの座標を使用する:

enter image description here

https://maps.googleapis.com/maps/api/staticmap?markers=37.414333,-122.076444&zoom=17&size=400x250&key=[myKey]の使用

enter image description here

6
Mick

GoogleMap.SnapshotReadyCallback インターフェースを使用できます。

使用方法のコード例を次に示します。

SnapshotReadyCallback callback = new SnapshotReadyCallback() {
                    Bitmap bitmap;

                    @Override
                    public void onSnapshotReady(Bitmap snapshot) {
                        bitmap = snapshot;
                        try {
                            FileOutputStream out = new FileOutputStream("/some/where/to/save/it/thesnapshot.png");
                            bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                };

                map.snapshot(callback);

ダイアログを表示するときにこれをコードに追加すると同時に、スナップショットを保存できます。上記のリンクでそれについてもっと読んでください。

これがあなたと幸運の助けになることを願っています。

2
Carlton

選択した場所のスナップショットを最初にダイアログに表示する場合は、マップビューの画面をビットマップに保存する必要があります。

マップビューをビットマップに変換するには、このコードを参照してください

Bitmap screen;
View v1 = MyView.getRootView();
v1.setDrawingCacheEnabled(true);
screen= Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);

上記のコードから、このビットマップを画像ビューに設定することでダイアログボックスでさらに使用できるビットマップを取得できます。ただし、ダイアログを生成する前とワーカースレッドですべての操作を実行する必要があることに注意してください。

0
Nikhil Singh

私は同じ問題に直面しました。 APIキーとサーバーキーを試してみましたが、どちらの場合も「Google MapsAPIサーバーがリクエストを拒否しました...」などの同じエラーが発生しました。最後に、"Google Static Maps API"がコンソールから無効になっていることに気付きました。私はenableで、すべて正常に動作します。

0
Bhavin Chauhan

あなたはマップライトを調べるかもしれません。グーグルマップのAPIとマップビューを使用しますが、それぞれをインタラクティブマップではなく画像のように扱います。ズームレベルを選択して、マップにマーカーを追加することもできます。

通常のグーグルマップフラグメントと同じようにxmlでマップを宣言しますが、タグmap:liteMode = "true"を含めます

<fragment xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:map="http://schemas.Android.com/apk/res-auto"
    Android:name="com.google.Android.gms.maps.MapFragment"
    Android:id="@+id/map"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    map:cameraZoom="13"
    map:mapType="normal"
    map:liteMode="true"/>

または、プログラムでマップを作成している場合は、

GoogleMapOptions options = new GoogleMapOptions().liteMode(true);

アクティビティコードからは、Googleマップの設定方法を知っているように見えるので、onActivityResultを次のように変更できます。

protected void onActivityResult(int requestCode,
                            int resultCode, Intent data) {

if (requestCode == PLACE_PICKER_REQUEST
        && resultCode == Activity.RESULT_OK) {

    final Place place = PlacePicker.getPlace(this, data);
    final CharSequence name = place.getName();
    final CharSequence address = place.getAddress();

    String attributions = (String) place.getAttributions();
    if (attributions == null) {
        attributions = "";
    }

    tv4.setText(place.getLatLng().toString()+"\n"+name+"\n"+address+"\n"+attributions);

    // Add this line to make the lite map show the location you just chose
    // and set the zoom level (10f is arbitrary)
    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(place.getLatLng(), 10f));

} else {
    super.onActivityResult(requestCode, resultCode, data);
}
}

詳細と引用:

あなたがより多くの情報を探しているならここから始めることができます、このページにはたくさんの良いリンクがあります https://developers.google.com/maps/documentation/Android-api/lite

こちらでGoogleLiteマップのデモアクティビティを確認することもできます: https://github.com/googlemaps/Android-samples/blob/master/ApiDemos/app/src/main/Java/com/example/mapdemo /LiteDemoActivity.Java

そして、これはライトマップを本当によく説明する素晴らしいビデオです: https://youtu.be/N0N1Xkc_1p

0
Ethan