所以,我一直在努力让它运行一段时间。问题是我将来自Google的地图密钥正确放置在main.xml中,但我似乎无法获取提供商信息,因为地图根本不显示。我已经运行了几次而且在同一个地方失败了。我试图调试并注意到返回了一个提供程序字符串,然后,返回null。
代码在
处失败@Override
protected void onResume() {
super.onResume();
locationManager
.requestLocationUpdates(getBestProvider(), 1000, 1, this);
}
带有以下错误消息。
08-20 05:14:43.573: E/AndroidRuntime(239): Uncaught handler: thread main exiting due to uncaught exception
08-20 05:14:43.583: E/AndroidRuntime(239): java.lang.RuntimeException: Unable to resume activity {com.shawnbe.mallfinder/com.shawnbe.mallfinder.MallFinderActivity}: java.lang.NullPointerException
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2950)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2965)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2516)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.os.Handler.dispatchMessage(Handler.java:99)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.os.Looper.loop(Looper.java:123)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread.main(ActivityThread.java:4363)
08-20 05:14:43.583: E/AndroidRuntime(239): at java.lang.reflect.Method.invokeNative(Native Method)
08-20 05:14:43.583: E/AndroidRuntime(239): at java.lang.reflect.Method.invoke(Method.java:521)
08-20 05:14:43.583: E/AndroidRuntime(239): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
08-20 05:14:43.583: E/AndroidRuntime(239): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
08-20 05:14:43.583: E/AndroidRuntime(239): at dalvik.system.NativeStart.main(Native Method)
08-20 05:14:43.583: E/AndroidRuntime(239): Caused by: java.lang.NullPointerException
08-20 05:14:43.583: E/AndroidRuntime(239): at com.shawnbe.mallfinder.MallFinderActivity.onResume(MallFinderActivity.java:61)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.Activity.performResume(Activity.java:3763)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2937)
08-20 05:14:43.583: E/AndroidRuntime(239): ... 12 more
有时候,代码似乎会启动网格,但没有地图。在其他运行中,它只是失败了。
以下是我的活动代码。
package com.shawnbe.mallfinder;
import java.util.List;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.location.Criteria;
import android.location.Location;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
public class MallFinderActivity extends MapActivity implements
android.location.LocationListener {
/** Called when the activity is first created. */
private MapController mapController;
private MapView mapView;
private android.location.LocationManager locationManager;
private GeoPoint currentPoint;
private Location currentLocation = null;
private TextView latituteField;
private TextView longitudeField;
private String bestProvider;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MapView mapView = (MapView) findViewById(R.id.mapView);
mapView.setBuiltInZoomControls(true);
Location location;
//getBestProvider();
if(bestProvider !=null)
location = locationManager.getLastKnownLocation(bestProvider);
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(
R.drawable.androidmarker);
MapItemizedOverlay itemizedoverlay = new MapItemizedOverlay(drawable,
this);
LocalGeoPoints loc = new LocalGeoPoints();
for (OverlayItem a : loc.overlayitems) {
itemizedoverlay.addOverlay(a);
}
mapOverlays.add(itemizedoverlay);
}
@Override
protected void onResume() {
super.onResume();
locationManager
.requestLocationUpdates(getBestProvider(), 1000, 1, this);
}
public void getLastLocation() {
String provider = getBestProvider();
currentLocation = locationManager.getLastKnownLocation(provider);
if (currentLocation != null) {
setCurrentLocation(currentLocation);
} else {
Toast.makeText(this, "Location not yet acquired", Toast.LENGTH_LONG)
.show();
}
}
public void animateToCurrentLocation() {
if (currentPoint != null) {
mapController.animateTo(currentPoint);
}
}
public String getBestProvider() {
locationManager = (android.location.LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);
criteria.setAccuracy(Criteria.NO_REQUIREMENT);
bestProvider = locationManager.getBestProvider(criteria, false);
return bestProvider;
}
public void setCurrentLocation(Location location) {
int currLatitude = (int) (location.getLatitude() * 1E6);
int currLongitude = (int) (location.getLongitude() * 1E6);
currentPoint = new GeoPoint(currLatitude, currLongitude);
currentLocation = new Location("");
currentLocation.setLatitude(currentPoint.getLatitudeE6() / 1e6);
currentLocation.setLongitude(currentPoint.getLongitudeE6() / 1e6);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
/* Remove the locationlistener updates when Activity is paused */
@Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(this);
}
@Override
public void onLocationChanged(Location location) {
int lat = (int) (location.getLatitude());
int lng = (int) (location.getLongitude());
latituteField.setText(String.valueOf(lat));
longitudeField.setText(String.valueOf(lng));
}
@Override
public void onProviderEnabled(String provider) {
Toast.makeText(this, "Enabled new provider " + provider,
Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderDisabled(String provider) {
Toast.makeText(this, "Disabled provider " + provider,
Toast.LENGTH_SHORT).show();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
以下是我使用从Google地图注册网站获取的密钥的main.xml ccomplete。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.google.android.maps.MapView
android:id="@+id/mapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:apiKey="0steid872FeGgae0eO2Dhdyei37sFPHG65t7N6XA"/>
</FrameLayout>
</LinearLayout>
答案 0 :(得分:4)
https://developers.google.com/maps/documentation/android/mapkey - 官方信息,该怎么做。
一步一步。
1)创建密钥库
2)从密钥库生成哈希MD5
3)在此处登录:https://developers.google.com/android/maps-api-signup
4)将密钥添加到您的应用程序
祝你好运!答案 1 :(得分:2)
在onCreate
中,您应该初始化locationManager
字段。移动
locationManager = (android.location.LocationManager) getSystemService(Context.LOCATION_SERVICE);
从getBestProvider()
方法到你的onCreate()
看看你的堆栈跟踪。您只有一个可能发生NPE的地方
. . .
08-20 05:14:43.583: E/AndroidRuntime(239): Caused by: java.lang.NullPointerException
08-20 05:14:43.583: E/AndroidRuntime(239): at com.shawnbe.mallfinder.MallFinderActivity.onResume(MallFinderActivity.java:61)
08-20 05:14:43.583: E/AndroidRuntime(239): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149)
答案 2 :(得分:2)
您获得NullPointer的原因是您在locationManager
中使用之前从未设置onResume()
。
onCreate()
注释掉的地方, getBestProvider()
会被调用。然后调用onResume()
并使用locationManager。虽然你还有另一个更复杂的情况。我将看看我是否可以在程序上逐步完成onResume()...
如果我是你,我会简化一些事情,只在onCreate()
中设置locationManager(作为一般编程习惯,你想限制方法中的副作用数量,我的意思是{{1}你应该只返回最好的提供者,并尽量不对你的状态做任何其他事情,或者你在该方法之外得到疯狂的意外事情)。如果你仍然有些疯狂,我会把getBestProvider()
的第一行放在getBestProvider()
onResume()
您可能不希望这样离开,但它会确保您的问题是protected void onResume()
{
super.onResume();
locationManager = (android.location.LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(getBestProvider(), 1000, 1, this);
}
答案 3 :(得分:1)
确保在使用之前对其进行初始化。
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
答案 4 :(得分:1)
如果你有有效的地图密钥,那么检查你是否正在将onManager的实例变为onResume,我猜你必须在onResume()中实例化位置管理器。
locationManager = (android.location.LocationManager)getSystemService(Context.LOCATION_SERVICE);
答案 5 :(得分:1)
您需要将地图视图居中并设置合理的缩放级别。否则,地图视图可能会显示一些随机区域。
mapView.setCenter(
new GeoPoint((int)(25.76032 * 1E6), (int)(-80.213928 * 1E6)));
//Set a reasonable zoom level
mapView.setZoom(12);
答案 6 :(得分:1)
NullPointerException是因为您正在访问locationmanager的null对象。
答案 7 :(得分:1)
在发布模式下创建apk并运行此apk文件,因为在发布模式下apk时会显示谷歌地图。
答案 8 :(得分:1)
请更新您的Google地图API密钥,之前的API密钥已过期,因此在这种情况下您无法看到Google地图。 https://developers.google.com/android/maps-api-signup
答案 9 :(得分:0)
概率上也存在mapkey问题:
如果您在调试模式下运行应用程序进行测试,则必须使用默认密钥库来创建mapkey(例如在linux上,您可以在〜/ .android / debug.keystore找到它)并插入此mapkey代码并使用它,直到您调试您的应用程序。
如果你想创建一个apk并运行它(例如在市场上发布你的apk),你必须使用你的个人密钥库创建一个新的mapkey,并在生成apk之前从你的代码中更改它
答案 10 :(得分:0)
MAP API需要有效密钥才能正常工作。
要获取应用程序的API密钥,您需要按照以下步骤操作。
使用keytool命令生成应用程序的认证指纹。
keytool -list -keystore~ / .android / debug.keystore 例如:94:1E:43:49:87:73:BB:E6:A6:88:D7:20:F1:8E:B5:98
使用指纹值,您可以从下面的链接生成地图api密钥
注意:
C:\ Program Files \ Java \ jdk1.7.0_06 \ jre \ bin
答案 11 :(得分:0)
locationManager为null,没有关于它的讨论,你是否在manifest.xml中指定了它?