这是我的代码:
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
在onCreate()方法中:(我只在onCreate()中使用它,除了包创建和变量asignation,使用该包。)
FragmentManager myFM = getSupportFragmentManager();
SupportMapFragment myMAPF =(SupportMapFragment)myFM.
findFragmentById(R.id.mapfragment);
map=myMAPF.getMap();//Exception at this line
布局:
<fragment
android:id="@+id/mapfragment"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/button"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" />
清单:
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="myapikey" />
我必须提到,当我生成api密钥时,我复制了debug.keystore文件并存储在一个更方便的位置,然后生成它。我在原始位置使用原始文件再次执行此操作,然后返回相同的SH1,因此我没有生成另一个API密钥。已在API访问页面中激活了中断器。
我之前看到过一些回答同样问题的问题,我尝试了很多解决方案......没有运气。
我正在使用Android 4.0版本的设备在Eclipse上运行该应用程序。
任何人都可以帮我找到错误的位置?谢谢。
编辑
抱歉,忘记了StackTrace
10-23 13:54:53.230: E/AndroidRuntime(6786): java.lang.RuntimeException: Unable to start activity ComponentInfo{mypackage/mypackage.MapActivity}: java.lang.NullPointerException
10-23 13:54:53.230: E/AndroidRuntime(6786): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
10-23 13:54:53.230: E/AndroidRuntime(6786): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
10-23 13:54:53.230: E/AndroidRuntime(6786): at android.app.ActivityThread.access$600(ActivityThread.java:123)
10-23 13:54:53.230: E/AndroidRuntime(6786): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
10-23 13:54:53.230: E/AndroidRuntime(6786): at android.os.Handler.dispatchMessage(Handler.java:99)
10-23 13:54:53.230: E/AndroidRuntime(6786): at android.os.Looper.loop(Looper.java:137)
10-23 13:54:53.230: E/AndroidRuntime(6786): at android.app.ActivityThread.main(ActivityThread.java:4424)
10-23 13:54:53.230: E/AndroidRuntime(6786): at java.lang.reflect.Method.invokeNative(Native Method)
10-23 13:54:53.230: E/AndroidRuntime(6786): at java.lang.reflect.Method.invoke(Method.java:511)
10-23 13:54:53.230: E/AndroidRuntime(6786): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
10-23 13:54:53.230: E/AndroidRuntime(6786): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
10-23 13:54:53.230: E/AndroidRuntime(6786): at dalvik.system.NativeStart.main(Native Method)
10-23 13:54:53.230: E/AndroidRuntime(6786): Caused by: java.lang.NullPointerException
10-23 13:54:53.230: E/AndroidRuntime(6786): at mypackage.MapActivity.onCreate(MapActivity.java:73)
10-23 13:54:53.230: E/AndroidRuntime(6786): at android.app.Activity.performCreate(Activity.java:4470)
10-23 13:54:53.230: E/AndroidRuntime(6786): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
10-23 13:54:53.230: E/AndroidRuntime(6786): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
我刚注意到一个奇怪的事情,在堆栈跟踪的第一行放了两倍我的应用程序的完整包...为什么会发生这种情况?
答案 0 :(得分:2)
您的地图尚不可用...您可以使用类似以下方法的内容来确定Play服务是否可用(我会在onActivityCreated中调用它,而不是onCreate):
protected boolean isPlayServicesAvailable() {
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (status == ConnectionResult.SUCCESS) {
return (true);
} else if (GooglePlayServicesUtil.isUserRecoverableError(status)) {
// deal with error
} else {
// maps is not available
}
return (false);
}
此外,您的Fragment需要实现Play服务所需的回调(接口GooglePlayServicesClient.ConnectionCallbacks和GooglePlayServicesClient.OnConnectionFailedListener:
/*
* Called by Location Services when the request to connect the
* client finishes successfully. At this point, you can
* request the current location or start periodic updates
*/
@Override
public void onConnected(Bundle dataBundle) {
// Display the connection status
Toast.makeText(context, "Connected to location services", Toast.LENGTH_SHORT).show();
}
/*
* Called by Location Services if the connection to the
* location client drops because of an error.
*/
@Override
public void onDisconnected() {
// Display the connection status
Toast.makeText(context, "Disconnected from location services. Please re-connect.",
Toast.LENGTH_SHORT).show();
}
/*
* Called by Location Services if the attempt to
* Location Services fails.
*/
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
/*
* Google Play services can resolve some errors it detects.
* If the error has a resolution, try sending an Intent to
* start a Google Play services activity that can resolve
* error.
*/
if (connectionResult.hasResolution()) {
try {
// Start an Activity that tries to resolve the error
connectionResult.startResolutionForResult(
SomeActivity,
CONNECTION_FAILURE_RESOLUTION_REQUEST);
/*
* Thrown if Google Play services canceled the original
* PendingIntent
*/
} catch (IntentSender.SendIntentException e) {
// Log the error
e.printStackTrace();
}
} else {
/*
* If no resolution is available, display a dialog to the
* user with the error.
*/
Toast.makeText(context, "Connection error", Toast.LENGTH_SHORT).show();
}
}
}
编辑: 这是我在包含地图片段的活动中使用它的方式:
if (isPlayServicesAvailable()) {
setContentView(R.layout.activity_with_map_fragment);
}
并在片段中:
if (getMap() != null) {
GoogleMap map = getMap();
// do things with the map
}
这应该让你去; - )