2013-10-10 96 views
0

嗨,所有我想导入一些源代码来测试显示在谷歌地图上的引脚,并拖动它们。虽然导入到Eclipse是成功的,我可以在我的设备上运行它们的地图不显示..是关于api的关键问题吗?我是否需要生成新的API键来显示它们?我被困任何人可以帮助..android无法显示谷歌地图

在这里,我已经导入项目

first one

second one

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

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> 

+0

您是否收到任何错误?仅发布相关代码。 – GrIsHu

+0

上面的代码是我正在使用的代码..没有任何其他错误..除地图本身之外的所有内容都显示 – regeme

+0

类型安全:ArrayList 的通用数组是为可变参数参数创建的。本地变量位置永远不会被读取。本地变量myGeoPoint永远不会被读取。局部变量localityName永远不会被读取..这些是我得到的一些警告.. – regeme

回答

2

你必须先创建自己的密钥。还有其他一些设置要遵循。这里是一个很好的toutorial->Google map v2

2名编辑建议:

  1. 内部布局的xml,用

(第4.5步在toutorial 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'(在toutorial中的第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> 
+0

嘿,问题依然存在..我已经完成了所有步骤......据我所知当将应用程序发布到市场上时,我们创建了自己独特的键。在这里我们使用debug.keystore,并且我从控制台生成了一个新的API密钥,然后添加到清单文件中,但仍然是相同的。 – regeme

+0

不是修复当前项目,而是创建一个新项目。在此之前,我会说2个更多的建议。 – Nizam

+0

未指定方向,默认为水平方向。当儿童动态添加 时,这是一个常见的错误来源。这是我尝试添加android:name =“com.google.android.gms.maps.SupportMapFragment”时得到的错误。我需要在layout xml中添加这个项目吗?目前我已经试过这个标签: regeme

0

您是否已通过控制台打开Goog​​le Maps Android API v2?很多人忘记把它变成。 选择左侧的服务并打开Goog​​le Maps Android API v2

+0

绝对..... – regeme