Android: How to Capture GPS Location Image

I am using Google Maps to find a location from the provided address.

I want to save the image of the location that I get from Google Maps onClick

.

Does anyone know how to do this?

Here is my code for google map and save onClick

public class TestGPSActivity extends MapActivity 
 {    
MapView mapView;
private MapController mc;
private GeoPoint p;
private double lng;
private double lat;
private Address address;
private View mCurrentUrlMask;
private File imageFile; 

class MapOverlay extends com.google.android.maps.Overlay
{
    @Override
    public boolean draw(Canvas canvas, MapView mapView, 
            boolean shadow, long when) 
    {
        super.draw(canvas, mapView, shadow);                   

        //---translate the GeoPoint to screen pixels---
        Point screenPts = new Point();
        mapView.getProjection().toPixels(p, screenPts);

        //---add the marker---
        Bitmap bmp = BitmapFactory.decodeResource(
                getResources(), R.drawable.pin);            
        canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null);         
        return true;
    }
} 
public boolean onTouchEvent(MotionEvent event, MapView mapView) 
{   
    //---when user lifts his finger---
    if (event.getAction() == 1) {                
        GeoPoint p = mapView.getProjection().fromPixels(
                (int) event.getX(),
                (int) event.getY());

        Geocoder geoCoder = new Geocoder(
                getBaseContext(), Locale.getDefault());
        try {
            List<Address> addresses = geoCoder.getFromLocation(
                    p.getLatitudeE6()  / 1E6, 
                    p.getLongitudeE6() / 1E6, 1);

            String add = "";
            if (addresses.size() > 0) 
            {
                for (int i=0; i<addresses.get(0).getMaxAddressLineIndex(); 
                        i++)
                    add += addresses.get(0).getAddressLine(i) + "\n";
            }

            Toast.makeText(getBaseContext(), add, Toast.LENGTH_LONG).show();
        }
        catch (IOException e) {                
            e.printStackTrace();
        }   
        return true;
    }
    else                
        return false;
}             


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gps_main);

    mapView = (MapView) findViewById(R.id.mapView); 

    mapView.setDrawingCacheEnabled(true);


     // image naming and path  to include sd card  appending name you choose for file
    String mPath = Environment.getExternalStorageDirectory().toString() + "/" + GPSActivity.DIRECTORY;   

    // create bitmap screen capture
    Bitmap bitmap;

    View v1 = mapView.getRootView();

    v1.setDrawingCacheEnabled(true);

    bitmap = Bitmap.createBitmap(v1.getDrawingCache());
    v1.setDrawingCacheEnabled(false);

    OutputStream fout = null;
    imageFile = new File(DemoCamGPSActivity.DIRECTORY);

    try {
        fout = new FileOutputStream(imageFile);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
        fout.flush();
        fout.close();

    } catch (FileNotFoundException e) {
        System.out.println("in file not found");
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }



    LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom);  
    View zoomView = mapView.getZoomControls();


    zoomLayout.addView(zoomView, 
            new LinearLayout.LayoutParams(
                    LayoutParams.WRAP_CONTENT, 
                    LayoutParams.WRAP_CONTENT)); 
    mapView.displayZoomControls(true);

    mc = mapView.getController();

    Geocoder geocoder = new Geocoder(this, Locale.getDefault());
    List<Address> addresses = null;
    try {   

        addresses = geocoder.getFromLocationName(getIntent().getStringExtra("address"), 1);

    } catch (IOException e) {



    }

    try{ 
        address = addresses.get(0);  
    }
    catch (Exception e) {
        flash("Unable to locate given address");
        startActivity(new Intent(this, GPSMainActivity.class));
        finish();
    }
    try{
      lng  = address.getLongitude();
      lat  = address.getLatitude();   

      GPSActivity.writeLog(getIntent().getStringExtra("address") +" GPS co-ordibnates : "+lat+" , "+lng);
    }catch (Exception e) {


    }


    p = new GeoPoint(
            (int) (lat * 1E6), 
            (int) (lng * 1E6));

    mc.animateTo(p);
    mc.setZoom(17); 

    //---Add a location marker---
    MapOverlay mapOverlay = new MapOverlay();
    List<Overlay> listOfOverlays = mapView.getOverlays();
    listOfOverlays.clear();
    listOfOverlays.add(mapOverlay);        

    mapView.invalidate();
    mapView.invalidate();        
}
private void flash(String data) {   
    Toast.makeText(getApplicationContext(), data, Toast.LENGTH_LONG).show();
}


@Override
protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub    
    return false;
}

public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if(keyCode == KeyEvent.KEYCODE_BACK)
    {
        startActivity(new Intent(this, GPSMainActivity.class));
        finish();
    }

    return super.onKeyDown(keyCode, event);
}    
 }

      

I am getting this error

03-28 16:54:12.580: E/AndroidRuntime(30010): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mentha.Demo/com.mentha.Demo.TestGPSActivity}: java.lang.NullPointerException

      

I am getting errors in this perticular code

   // create bitmap screen capture
    Bitmap bitmap;

    View v1 = mapView.getRootView();

    v1.setDrawingCacheEnabled(true);

    bitmap = Bitmap.createBitmap(v1.getDrawingCache());
    v1.setDrawingCacheEnabled(false);

    OutputStream fout = null;
    imageFile = new File(DemoCamGPSActivity.DIRECTORY);

    try {
        fout = new FileOutputStream(imageFile);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
        fout.flush();
        fout.close();

    } catch (FileNotFoundException e) {
        System.out.println("in file not found");
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    Uri uri = Uri.fromFile(new File(mPath));

      

Please help me .. thanks in advance

+3


source to share


3 answers


I have solved this problem. I'm having a problem capturing an image of a GPS location. I just created a capture menu where once the GPS location is loaded, you can take a picture by clicking the capture menu button.

Here is all the code to capture GPS screenshot and determine GPS location.



public class TestGPSActivity extends MapActivity 
{    
MapView mapView;
private MapController mc;
private GeoPoint p;
private double lng;
private double lat;
private Address address; 

//google Map
class MapOverlay extends com.google.android.maps.Overlay
{
    @Override
    public boolean draw(Canvas canvas, MapView mapView, 
            boolean shadow, long when) 
    {
        super.draw(canvas, mapView, shadow);                   

        //---translate the GeoPoint to screen pixels---
        Point screenPts = new Point();
        mapView.getProjection().toPixels(p, screenPts);

        //---add the marker---
        Bitmap bmp = BitmapFactory.decodeResource(
                getResources(), R.drawable.pin);            
        canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null);         
        return true;
    }
} 
public boolean onTouchEvent(MotionEvent event, MapView mapView) 
{   
    //---when user lifts his finger---
    if (event.getAction() == 1) {                
        GeoPoint p = mapView.getProjection().fromPixels(
                (int) event.getX(),
                (int) event.getY());

        Geocoder geoCoder = new Geocoder(
                getBaseContext(), Locale.getDefault());
        try {
            List<Address> addresses = geoCoder.getFromLocation(
                    p.getLatitudeE6()  / 1E6, 
                    p.getLongitudeE6() / 1E6, 1);

            String add = "";
            if (addresses.size() > 0) 
            {
                for (int i=0; i<addresses.get(0).getMaxAddressLineIndex();i++)
                    add += addresses.get(0).getAddressLine(i) + "\n";
            }

            Toast.makeText(getBaseContext(), add, Toast.LENGTH_LONG).show();
        }
        catch (IOException e) {                
            e.printStackTrace();
        }   
        return true;
    }
    else                
        return false;
}             

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gps_main);

    mapView = (MapView) findViewById(R.id.mapView); 
    LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom);  
    View zoomView = mapView.getZoomControls(); 

    zoomLayout.addView(zoomView, 
            new LinearLayout.LayoutParams(
                    LayoutParams.WRAP_CONTENT, 
                    LayoutParams.WRAP_CONTENT)); 
    mapView.displayZoomControls(true);

    mc = mapView.getController();

    Geocoder geocoder = new Geocoder(this, Locale.getDefault());
    List<Address> addresses = null;
    try {   

        addresses = geocoder.getFromLocationName(getIntent().getStringExtra("address"), 1);

    } catch (IOException e) { 
        e.printStackTrace();
    }

    try{ 
        address = addresses.get(0);  
    }
    catch (Exception e) {
        flash("Unable to locate given address");
        startActivity(new Intent(this, GPSMainActivity.class));
        finish();
    }
    try{
        //stores the Longitude n lattitude in log file
        lng  = address.getLongitude();  
        lat  = address.getLatitude();   

        //for writing into log.text
        HomeActivity.writeLog(getIntent().getStringExtra("address") +" GPS co-ordibnates : "+lat+" , "+lng);

    }catch (Exception e) { 
        e.printStackTrace();
    } 
    p = new GeoPoint(
            (int) (lat * 1E6), 
            (int) (lng * 1E6));

    mc.animateTo(p);
    mc.setZoom(17); 

    //---Add a location marker---
    MapOverlay mapOverlay = new MapOverlay();
    List<Overlay> listOfOverlays = mapView.getOverlays();
    listOfOverlays.clear();
    listOfOverlays.add(mapOverlay);        

    mapView.invalidate();

    //mapView.invalidate();      
}   

//ScreenShot of Image
private void screenshot() {
    try{
        String mapDIR = HomeActivity.DIRECTORY+"/Image";

        File f = new File(mapDIR);

        if(! f.exists())
        {
            f.mkdir();
        }

        MapView v1 = (MapView)findViewById(R.id.mapView);
        v1.setDrawingCacheEnabled(true);

        Bitmap b = Bitmap.createBitmap(v1.getDrawingCache());

        try
        {
            FileOutputStream fos = new FileOutputStream(mapDIR+"/"+System.currentTimeMillis()+".png");
            b.compress(CompressFormat.PNG, 50, fos);
            fos.close();

        } catch (FileNotFoundException e) {
            Toast.makeText(getApplicationContext(), e.getMessage(),Toast.LENGTH_LONG).show();
            e.printStackTrace();
        } catch (IOException e) {
            Toast.makeText(getApplicationContext(), e.getMessage(),Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
        v1.setDrawingCacheEnabled(false); // clear drawing cache
    }catch (Exception e) {
        Toast.makeText(getApplicationContext(), e.getMessage(),Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }

}

private void flash(String data) {   
    Toast.makeText(getApplicationContext(), data, Toast.LENGTH_LONG).show();
}

@Override
protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub    
    return false;
}

public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if(keyCode == KeyEvent.KEYCODE_BACK)
    {
        startActivity(new Intent(this, GPSMainActivity.class));
        finish();
    } 
    return super.onKeyDown(keyCode, event);
}     
//menu button
@Override
public boolean onCreateOptionsMenu(android.view.Menu menu) 
{
    super.onCreateOptionsMenu(menu);

    menu.add(0, 1, 0 , "Exit");
    menu.add(0, 2, 0 , "Capture Image");



    return true;
} 

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item)
{
    switch(item.getItemId()) 
    {
    case 1: 
        startActivity(new Intent(this, GPSMainActivity.class));
        finish();
        break; 
    case 2: 
        screenshot();
        Toast.makeText(getApplicationContext(), "Captured Map", Toast.LENGTH_SHORT).show();
        break; 
    }
    return super.onMenuItemSelected(featureId, item);
}
}

      

Thanks for everything .. Hope this helps someone ..

+2


source


Could using static maps be the solution you were looking for?



https://developers.google.com/maps/documentation/staticmaps/

+3


source


I believe this answer will help you

0


source







All Articles