Android:如何捕获GPS位置的图像

时间:2012-03-28 10:04:57

标签: android google-maps gps

我正在使用Google地图在提供的地址上查找位置。

我想存储从Google地图onClick获得的位置图片。

有谁知道怎么做?

这是我的谷歌地图和代码的代码存储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);
}    
 }

我收到此错误

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

我在这个特定代码上遇到错误

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

请帮帮我..提前谢谢

3 个答案:

答案 0 :(得分:3)

使用静态地图是否是您正在寻找的解决方案?

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

答案 1 :(得分:2)

我已经解决了这个问题。我有GPS位置的图像捕获问题。我刚刚创建了捕获菜单,在上传GPS位置后,可以通过单击捕获菜单按钮捕获图像。

以下是捕获GPS位置和屏幕截图的完整代码。如何找到GPS位置。

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

感谢所有人..希望这会对某人有所帮助..

答案 2 :(得分:0)

我相信this答案可以帮助你