2013-08-28 43 views
0

我使用谷歌地图V2在我的应用程序,但我得到的空白页是这样的:安卓:使用空白页时,谷歌地图API 2

1

我做这些步骤E添加此功能我的项目。

  1. 首先我更新了谷歌播放服务
    2

  2. 新增D:\AndroidSDK\extras\google\google_play_services\libproject\google-play-services_lib作为一个依赖于我的主要项目也是在这个路径的libs文件夹中的jar文件。在Google APIs Console 4

  3. 3

  4. 激活谷歌地图的Android的API V2创建新的Android按键,其结果是: 5

完成这些步骤之后我加入了API密钥进入清单文件:

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

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

    <permission 
     android:name="com.example.test.permission.MAPS_RECEIVE" 
     android:protectionLevel="signature"/> 
    <uses-permission android:name="com.example.test.permission.MAPS_RECEIVE/> 
    <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" /> 
    <!-- External storage for caching. --> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <!-- My Location --> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

    <uses-permission android:name="android.permission.CALL_PHONE" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 

    <!-- Maps API needs OpenGL ES 2.0. --> 
    <uses-feature 
     android:glEsVersion="0x00020000" 
     android:required="true" /> 
    <!-- End of copy. --> 

    <application android:label="@string/app_name" 
      android:icon="@drawable/ic_launcher" 
      android:theme="@style/Theme.Sherlock.Light"> 
    <activity android:name=".ActivityBusinessDirections" 
       android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 

    <meta-data 
      android:name="com.google.android.maps.v2.API_KEY" 
      android:value="AIzaSyBmFPG-Fri--**************" /> 
    </application> 
</manifest> 

最后,这是我的布局,我使用

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" > 

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

</RelativeLayout> 

编辑:这是我的活动代码

public class ActivityBusinessDirections extends FragmentActivity implements LocationListener { 

GoogleMap mGoogleMap; 
ArrayList<LatLng> mMarkerPoints; 
double mLatitude=0; 
double mLongitude=0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_business_directions); 

    // Getting Google Play availability status 
    int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext()); 

    if(status!=ConnectionResult.SUCCESS){ // Google Play Services are not available 

     int requestCode = 10; 
     Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode); 
     dialog.show(); 

    }else { // Google Play Services are available 

     // Initializing 
     mMarkerPoints = new ArrayList<LatLng>(); 

     // Getting reference to SupportMapFragment of the activity_main 
     SupportMapFragment fm = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map); 

     // Getting Map for the SupportMapFragment 
     mGoogleMap = fm.getMap(); 

     // Enable MyLocation Button in the Map 
     mGoogleMap.setMyLocationEnabled(true); 

     // Getting LocationManager object from System Service LOCATION_SERVICE 
     LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

     // Creating a criteria object to retrieve provider 
     Criteria criteria = new Criteria(); 

     // Getting the name of the best provider 
     String provider = locationManager.getBestProvider(criteria, true); 

     // Getting Current Location From GPS 
     Location location = locationManager.getLastKnownLocation(provider); 

     if(location!=null){ 
      onLocationChanged(location); 
     } 

     locationManager.requestLocationUpdates(provider, 20000, 0, this); 

     // Setting onclick event listener for the map 
     mGoogleMap.setOnMapClickListener(new OnMapClickListener() { 

      @Override 
      public void onMapClick(LatLng point) { 

       // Already map contain destination location 
       if(mMarkerPoints.size()>1){ 

        FragmentManager fm = getSupportFragmentManager(); 
        mMarkerPoints.clear(); 
        mGoogleMap.clear(); 
        LatLng startPoint = new LatLng(mLatitude, mLongitude); 

        // draw the marker at the current position 
        drawMarker(startPoint); 
       } 

       // draws the marker at the currently touched location 
       drawMarker(point); 

       // Checks, whether start and end locations are captured 
       if(mMarkerPoints.size() >= 2){ 
        LatLng origin = mMarkerPoints.get(0); 
        LatLng dest = mMarkerPoints.get(1); 

        // Getting URL to the Google Directions API 
        String url = getDirectionsUrl(origin, dest); 

        DownloadTask downloadTask = new DownloadTask(); 

        // Start downloading json data from Google Directions API 
        downloadTask.execute(url); 
       } 
      } 
     }); 
    } 
} 

private String getDirectionsUrl(LatLng origin,LatLng dest){ 

    // Origin of route 
    String str_origin = "origin="+origin.latitude+","+origin.longitude; 

    // Destination of route 
    String str_dest = "destination="+dest.latitude+","+dest.longitude; 

    // Sensor enabled 
    String sensor = "sensor=false"; 

    // Building the parameters to the web service 
    String parameters = str_origin+"&"+str_dest+"&"+sensor; 

    // Output format 
    String output = "json"; 

    // Building the url to the web service 
    String url = "https://maps.googleapis.com/maps/api/directions/"+output+"?"+parameters; 

    return url; 
} 

/** A method to download json data from url */ 
private String downloadUrl(String strUrl) throws IOException{ 
    String data = ""; 
    InputStream iStream = null; 
    HttpURLConnection urlConnection = null; 
    try{ 
     URL url = new URL(strUrl); 

     // Creating an http connection to communicate with url 
     urlConnection = (HttpURLConnection) url.openConnection(); 

     // Connecting to url 
     urlConnection.connect(); 

     // Reading data from url 
     iStream = urlConnection.getInputStream(); 

     BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); 

     StringBuffer sb = new StringBuffer(); 

     String line = ""; 
     while((line = br.readLine()) != null){ 
      sb.append(line); 
     } 

     data = sb.toString(); 

     br.close(); 

    }catch(Exception e){ 
     Log.d("Exception while downloading url", e.toString()); 
    }finally{ 
     iStream.close(); 
     urlConnection.disconnect(); 
    } 
    return data; 
} 

/** A class to download data from Google Directions URL */ 
private class DownloadTask extends AsyncTask<String, Void, String>{ 

    // Downloading data in non-ui thread 
    @Override 
    protected String doInBackground(String... url) { 

     // For storing data from web service 
     String data = ""; 

     try{ 
      // Fetching the data from web service 
      data = downloadUrl(url[0]); 
     }catch(Exception e){ 
      Log.d("Background Task",e.toString()); 
     } 
     return data; 
    } 

    // Executes in UI thread, after the execution of 
    // doInBackground() 
    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 

     ParserTask parserTask = new ParserTask(); 

     // Invokes the thread for parsing the JSON data 
     parserTask.execute(result); 
    } 
} 

/** A class to parse the Google Directions in JSON format */ 
private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String,String>>> >{ 

    // Parsing the data in non-ui thread 
    @Override 
    protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) { 

     JSONObject jObject; 
     List<List<HashMap<String, String>>> routes = null; 

     try{ 
      jObject = new JSONObject(jsonData[0]); 
      DirectionsJSONParser parser = new DirectionsJSONParser(); 

      // Starts parsing data 
      routes = parser.parse(jObject); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
     return routes; 
    } 

    // Executes in UI thread, after the parsing process 
    @Override 
    protected void onPostExecute(List<List<HashMap<String, String>>> result) { 
     ArrayList<LatLng> points = null; 
     PolylineOptions lineOptions = null; 

     // Traversing through all the routes 
     for(int i=0;i<result.size();i++){ 
      points = new ArrayList<LatLng>(); 
      lineOptions = new PolylineOptions(); 

      // Fetching i-th route 
      List<HashMap<String, String>> path = result.get(i); 

      // Fetching all the points in i-th route 
      for(int j=0;j<path.size();j++){ 
       HashMap<String,String> point = path.get(j); 

       double lat = Double.parseDouble(point.get("lat")); 
       double lng = Double.parseDouble(point.get("lng")); 
       LatLng position = new LatLng(lat, lng); 

       points.add(position); 
      } 

      // Adding all the points in the route to LineOptions 
      lineOptions.addAll(points); 
      lineOptions.width(2); 
      lineOptions.color(Color.RED); 
     } 

     // Drawing polyline in the Google Map for the i-th route 
     mGoogleMap.addPolyline(lineOptions); 
    } 
} 

private void drawMarker(LatLng point){ 
    mMarkerPoints.add(point); 

    // Creating MarkerOptions 
    MarkerOptions options = new MarkerOptions(); 

    // Setting the position of the marker 
    options.position(point); 

    /** 
    * For the start location, the color of marker is GREEN and 
    * for the end location, the color of marker is RED. 
    */ 
    if(mMarkerPoints.size()==1){ 
     options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)); 
    }else if(mMarkerPoints.size()==2){ 
     options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)); 
    } 

    // Add new marker to the Google Map Android API V2 
    mGoogleMap.addMarker(options); 
} 

@Override 
public void onLocationChanged(Location location) { 
    // Draw the marker, if destination location is not set 
    if(mMarkerPoints.size() < 2){ 

     mLatitude = location.getLatitude(); 
     mLongitude = location.getLongitude(); 
     LatLng point = new LatLng(mLatitude, mLongitude); 

     mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(point)); 
     mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(12)); 

     drawMarker(point); 
    } 
} 

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

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

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

继这个答案的步骤?:http://stackoverflow.com/questions/18325071/maps-android-v2-java-lang-noclassdeffounderror-com-google-android-gms-rstylea/18325311#18325311 – Nerd

+0

你的手机有互联网连接? – Tobiel

+0

我已添加为图书馆。 intellijIdea会在您添加为依赖项时自动执行此操作。 –

回答

5

如果你改变了清单只是

  • 明确的数据

  • 卸载应用程序API密钥(在Android设备),并重新安装
+0

非常感谢,我这个问题涉及了3天。 –

+0

你好,欢迎bro。 – Ssisakhti

0

尝试将此权限添加到您的清单

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
+0

谢谢,但没有工作 –

1

从您发布的清单文件看起来像您的包名:package="com.com.my_package_name"

不匹配时使用的谷歌地图的权限包名称:

<permission 
    android:name="com.my_package_name.permission.MAPS_RECEIVE" 
    android:protectionLevel="signature"/> 
<uses-permission android:name="com.my_package_name.permission.MAPS_RECEIVE/> 

你可以看到,com.com.my_package_name不同于com.my_package_name,这一定是你的问题。

+0

是的,我也一样你说 –

+0

我更新了清单 –

+0

@MisaghAghakhani你是否检查过你使用的是哪个密钥? – Shadow

0

有两个键调试和释放键。如果你签名你的apk,你想使用释放密钥。 我想你使用了调试密钥。所以只有地图看起来空白。发布关键程序在这里。

How to get production key for google map?

0

确保您使用API​​控制台的同一SHA1指纹是 项目建有,找到蚀 窗口>首选项>安卓>生成> SHA1指纹的SHA1指纹。