0

大家好,我正在尝试导入一些源代码来测试在谷歌地图上显示图钉并拖动它们.. 虽然导入到 eclipse 是成功的,我可以在我的设备上运行它们,但地图没有显示出来.. 是关于 api关键问题 ?我需要生成新的 api 键来显示它们吗?我被卡住了谁能帮忙..

这是我导入的项目

第一

第二个

也是这里的第二个链接的源代码。

   public class rescue extends MapActivity {


private LocationManager myLocationManager;
private LocationListener myLocationListener;

private MapView myMapView;
private MapController myMapController;
private String provider;
private MyLocationOverlay me=null;


private int defaultLat =(int)(51.51216124955517); 
private int defaultLong =(int)(-0.1373291015625);

private GeoPoint defaultGeoPint = new GeoPoint(defaultLat,defaultLong);

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.rescue);

    setCurrentLocation();
   }

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

private void setCurrentLocation()
{
  myMapView = (MapView)findViewById(R.id.rescueMapView);
  myMapView.setTraffic(true);
  ///myMapView.setBuiltInZoomControls(true);

  myMapController = myMapView.getController();
  myMapController.setZoom(16); //Fixed Zoom Level

  myLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
  myLocationListener = new MyLocationListener();

  try
  {
  Criteria criteria = new Criteria();
  provider = myLocationManager.getBestProvider(criteria, false);

  Location location = myLocationManager.getLastKnownLocation(provider);

  myLocationManager.requestLocationUpdates(
          provider,
    0,
    0,
    myLocationListener);

  Location lastLocation = myLocationManager.getLastKnownLocation(provider); 

      if(lastLocation != null)
      {
          int lastLocLat =(int)(lastLocation.getLatitude()*1000000); 
          int lastLocLong =(int)(lastLocation.getLongitude()*1000000);
          //Get the current location in start-up
          GeoPoint initGeoPoint = new GeoPoint(lastLocLat,lastLocLong);
          CenterLocatio(initGeoPoint);
      }
      else
      {
          AlertDialog.Builder builder = new AlertDialog.Builder(this);
          builder.setTitle("Location Services Disabled")
                 .setMessage("The location service on the device are disabled, your location is not able to be found, please call AXA uding the button below to be rescued")
                 .setCancelable(false)
                 .setPositiveButton("Drop pin", new DialogInterface.OnClickListener() {
                     public void onClick(DialogInterface dialog, int id) {
                          //do things
                         CenterLocatio(defaultGeoPint);
                     }
                 });
          builder.create().show();
      }
  }
  catch (Exception e) 
  {
    // TODO: handle exception


        Context context = getApplicationContext();
        String toasttext = e.getMessage();
        int duration = Toast.LENGTH_SHORT;

        Toast toast = Toast.makeText(context, toasttext, duration);
        toast.show();
  }
}

private void CenterLocatio(GeoPoint centerGeoPoint)
 {
    myMapView.getOverlays().clear();
  myMapController.animateTo(centerGeoPoint);
  Drawable marker=getResources().getDrawable(R.drawable.marker);

    marker.setBounds(0, 0, marker.getIntrinsicWidth(),
                            marker.getIntrinsicHeight());

    int lat = centerGeoPoint.getLatitudeE6();
    int lon = centerGeoPoint.getLongitudeE6();

    double lat1 = centerGeoPoint.getLatitudeE6()/1E6;

    double lon1 = centerGeoPoint.getLongitudeE6()/1E6;

    ArrayList<Double> passing = new ArrayList<Double>();
    passing.add(lat1);
    passing.add(lon1);

    Context context = getApplicationContext(); 
    ReverseGeocodeLookupTask task = new ReverseGeocodeLookupTask();
    task.applicationContext = context;
    task.activityContext = rescue.this; 
    task.execute(passing);

    myMapView.getOverlays().add(new SitesOverlay(marker,lat, lon ));

    me=new MyLocationOverlay(this, myMapView);
    myMapView.getOverlays().add(me);

 };

 private class MyLocationListener implements LocationListener{

     @Override
      public void onLocationChanged(Location argLocation) {
       // TODO Auto-generated method stub
       GeoPoint myGeoPoint = new GeoPoint(
        (int)(argLocation.getLatitude()*1000000),
        (int)(argLocation.getLongitude()*1000000));

       //CenterLocatio(myGeoPoint);
      }

      public void onProviderDisabled(String provider) {
       // TODO Auto-generated method stub
      }

      public void onProviderEnabled(String provider) {
       // TODO Auto-generated method stub
      }

      public void onStatusChanged(String provider,
        int status, Bundle extras) {
       // TODO Auto-generated method stub
      }
     }


 private GeoPoint getPoint(int lat, int lon) {

     return(new GeoPoint(lat, lon));

     /*
        return(new GeoPoint((int)(lat*1000000.0),
                              (int)(lon*1000000.0)));
                           */
      }
  private class SitesOverlay extends ItemizedOverlay<OverlayItem> {
        private List<OverlayItem> items=new ArrayList<OverlayItem>();
        private Drawable marker=null;
        private OverlayItem inDrag=null;
        private ImageView dragImage=null;
        private int xDragImageOffset=0;
        private int yDragImageOffset=0;
        private int xDragTouchOffset=0;
        private int yDragTouchOffset=0;

        public SitesOverlay(Drawable marker, int lat, int longitude) {
          super(marker);
          this.marker=marker;

          dragImage=(ImageView)findViewById(R.id.drag);
          xDragImageOffset=dragImage.getDrawable().getIntrinsicWidth()/2;
          yDragImageOffset=dragImage.getDrawable().getIntrinsicHeight();

          items.add(new OverlayItem(getPoint(lat,
                                              longitude),
                                    "UN", "United Nations"));

          /*
          items.add(new OverlayItem(getPoint(40.76866299974387,
                                              -73.98268461227417),
                                    "Lincoln Center",
                                    "Home of Jazz at Lincoln Center"));
           */
          populate();
        }

        @Override
        protected OverlayItem createItem(int i) {
          return(items.get(i));
        }

        @Override
        public void draw(Canvas canvas, MapView mapView,
                          boolean shadow) {
          super.draw(canvas, mapView, shadow);

          boundCenterBottom(marker);
        }

        @Override
        public int size() {
          return(items.size());
        }

        @Override
        public boolean onTouchEvent(MotionEvent event, MapView mapView) {
          final int action=event.getAction();
          final int x=(int)event.getX();
          final int y=(int)event.getY();
          boolean result=false;

          if (action==MotionEvent.ACTION_DOWN) {
            for (OverlayItem item : items) {
              Point p=new Point(0,0);

              myMapView.getProjection().toPixels(item.getPoint(), p);

              if (hitTest(item, marker, x-p.x, y-p.y)) {
                result=true;
                inDrag=item;
                items.remove(inDrag);
                populate();

                xDragTouchOffset=0;
                yDragTouchOffset=0;

                setDragImagePosition(p.x, p.y);
                dragImage.setVisibility(View.VISIBLE);

                xDragTouchOffset=x-p.x;
                yDragTouchOffset=y-p.y;

                break;
              }
            }
          }
          else if (action==MotionEvent.ACTION_MOVE && inDrag!=null) {
            setDragImagePosition(x, y);
            result=true;
          }
          else if (action==MotionEvent.ACTION_UP && inDrag!=null) {
            dragImage.setVisibility(View.GONE);

            GeoPoint pt=myMapView.getProjection().fromPixels(x-xDragTouchOffset,
                                                       y-yDragTouchOffset);


            String title = inDrag.getTitle();
            OverlayItem toDrop=new OverlayItem(pt, title,
                                               inDrag.getSnippet());

            items.add(toDrop);
            populate();
            double lat = pt.getLatitudeE6()/1E6;

            double lon = pt.getLongitudeE6()/1E6;

            ArrayList<Double> passing = new ArrayList<Double>();
            passing.add(lat);
            passing.add(lon);

            Context context = getApplicationContext(); 
            ReverseGeocodeLookupTask task = new ReverseGeocodeLookupTask();
            task.applicationContext = context;
            task.activityContext = rescue.this; 
            task.execute(passing);

            //CenterLocatio(pt);
            inDrag=null;
            result=true;
          }

          return(result || super.onTouchEvent(event, mapView));
        }

        private void setDragImagePosition(int x, int y) {
          RelativeLayout.LayoutParams lp=
            (RelativeLayout.LayoutParams)dragImage.getLayoutParams();

          lp.setMargins(x-xDragImageOffset-xDragTouchOffset,
                          y-yDragImageOffset-yDragTouchOffset, 0, 0);
          dragImage.setLayoutParams(lp);
        }
      }

  public class ReverseGeocodeLookupTask extends AsyncTask <ArrayList<Double>, Void, String>
    {
        private ProgressDialog dialog;
        protected Context applicationContext;
        protected Context activityContext;

        @Override
        protected void onPreExecute()
        {
            this.dialog = ProgressDialog.show(activityContext, "Please wait", 
                    "Requesting location", true);
        }


        protected String doInBackground(ArrayList<Double>... params) 
        {


            String foundAddress = "";
            String localityName = "";
            ArrayList<Double> passed = params[0];
            double lat = passed.get(0);
            double lon = passed.get(1);
            try
            {

            List<Address> addresses = new Geocoder(applicationContext,Locale.getDefault()).getFromLocation(lat,lon, 1);
            if (addresses.size() > 0)
            {
                String addressLine = "";

                for(Integer i = 0; i < addresses.get(0).getMaxAddressLineIndex(); i++)
                {
                    if(!addressLine.equals(""))
                    {
                        addressLine+= ", ";
                    }

                    addressLine+=  addresses.get(0).getAddressLine(i);
                }

                if(addressLine!="")
                {
                    foundAddress+= addressLine;
                }
            }
            }
            catch (Exception e) {
            }
            finally
            {
            }
            return foundAddress;
        }

        @Override
        protected void onPostExecute(String result)
        {
            this.dialog.cancel();
            showToast(result);

        }
    }

  public void showToast(String message)
    {
        Context context = getApplicationContext();
        String toasttext = message;
        int duration = Toast.LENGTH_SHORT;

        Toast toast = Toast.makeText(context, toasttext, duration);
        toast.show();
    }
      }

感谢您的想法

这是布局xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" android:id="@+id/rescue_rel_layout"
android:gravity="top" android:background="#fff">
<RelativeLayout android:layout_width="fill_parent"
    android:layout_height="45dp" android:id="@+id/rescue_top_control_bar"
    android:background="#FFFFFF" android:gravity="center_vertical">



    <TextView android:id="@+id/rescueText"
        android:layout_width="wrap_content" 
        android:layout_height="55dp"
        android:text="Where are you ?" 
        android:gravity="center_vertical|center_horizontal"
        android:textSize="20dp" 
        android:textStyle="bold" 
        android:textColor="#1D0073"
        android:layout_weight="1.0" 
        android:layout_centerInParent="true"
    />



</RelativeLayout>



<LinearLayout android:id="@+id/LinearLayout01"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:layout_below="@id/rescue_top_control_bar"

    android:orientation="vertical">





    <RelativeLayout     
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ff0000"
    >

      <RelativeLayout     
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ff0000"
    android:layout_weight="1"
    >

          <RelativeLayout     
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ff0000"
    android:layout_weight="1"
    >     

     <com.google.android.maps.MapView

             android:layout_width="fill_parent"
             android:layout_height="fill_parent"
             android:foregroundGravity="top"
             android:apiKey=""
             android:clickable="true"
             android:layout_weight="1"
             android:id="@+id/rescueMapView"
             />

     <ImageView android:id="@+id/drag"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/marker_up"
        android:visibility="gone"
      /> 


     </RelativeLayout>

     <LinearLayout 
         android:id="@+id/loader" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:background="#000"
        android:layout_alignParentBottom="true"
        android:visibility="invisible"
        >



        </LinearLayout>         

     </RelativeLayout>




    </RelativeLayout>    


</LinearLayout>

4

2 回答 2

2

您必须先创建自己的密钥。还有一些其他的设置要遵循。这是一个不错的教程-> Google map v2

2 我建议的编辑:

  1. 在您的布局 xml 中,使用

(该教程中的第 4.5 步。activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >


<fragment
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>


</RelativeLayout>

2.让你的主类扩展`FragmentActivity'(教程中的第4.6步)

 public class MainActivity extends FragmentActivity {
   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);// This line is all that you need to display a map.

    }
   }

最后,重要的一个,AndroidManifest.xml。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="your_package"
    android:versionCode="1"
    android:versionName="1.0" >


<permission
    android:name="your_package.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" />

<uses-permission android:name="your_package.permission.MAPS_RECEIVE" />

<uses-sdk
    android:minSdkVersion="12"
    android:targetSdkVersion="17" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<!-- Required to show current location -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<!-- Required OpenGL ES 2.0. for Maps V2 -->
<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name">
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppBaseTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <!-- Goolge API Key -->
    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="your_api_key" />
</application>


</manifest>
于 2013-10-10T17:10:54.757 回答
0

您是否从控制台打开了 Google Maps Android API v2?很多人忘记转动它。选择左侧的服务并打开 Google Maps Android API v2

于 2013-10-10T18:14:31.073 回答