Android 在大多数设备上使用Google Maps v2时,应用程序崩溃
我正在尝试编写一些使用谷歌地图API的应用程序。地图显示在主活动中 在某些手机上,包括emulator,应用程序在启动后立即崩溃。它唯一可以使用的手机是我的Galaxy S1,它运行CM10.1(4.2.2) 它在我的HTC DESIRE HD上崩溃(同样是4.2.2) MainActivity.java:Android 在大多数设备上使用Google Maps v2时,应用程序崩溃,android,google-maps,android-mapview,Android,Google Maps,Android Mapview,我正在尝试编写一些使用谷歌地图API的应用程序。地图显示在主活动中 在某些手机上,包括emulator,应用程序在启动后立即崩溃。它唯一可以使用的手机是我的Galaxy S1,它运行CM10.1(4.2.2) 它在我的HTC DESIRE HD上崩溃(同样是4.2.2) MainActivity.java: import android.location.Location; import android.location.LocationListener; import android.loca
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.Toast;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
public class MainActivity extends Activity {
public void ToastLoadShout(String msg){Toast.makeText(this, msg, Toast.LENGTH_LONG).show();}
static final LatLng HAMBURG = new LatLng(53.558, 9.927);
static final LatLng KIEL = new LatLng(53.551, 9.993);
static final LatLng gps = new LatLng(0, 0);
static double lat=0.0;
static double lon=0.0;
private GoogleMap map;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
turnGPSOn();
map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map))
.getMap();
// Marker hamburg = map.addMarker(new MarkerOptions().position(HAMBURG)
// .title("Hamburg"));
Marker kiel = map.addMarker(new MarkerOptions()
.position(KIEL)
.title("Free shyt")
.snippet("Come and take this shit")
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.ic_launcher)));
ImageView locate;
locate = (ImageView) findViewById(R.id.locate);
locate.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
ReNewCoordinates();
if (lat==0&&lon==0)
ToastLoadShout("Try again in a few seconds.");
else
{
map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat,lon), 10));
ToastLoadShout("your location is: "+lat+" , "+lon);
map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
Marker loc = map.addMarker(new MarkerOptions()
.position(new LatLng(lat,lon))
.icon(BitmapDescriptorFactory
.fromResource(R.drawable.loc)));
}
}
});
map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(50.909474,13.917618), 10000));
map.animateCamera(CameraUpdateFactory.zoomTo(1), 20, null);
// Move the camera instantly to hamburg with a zoom of 15.
//map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat,lon), 15));
// Zoom in, animating the camera.
//map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
//ToastLoadShout("your location is: "+lat+" , "+lon);
ImageView add;
add = (ImageView) findViewById(R.id.add);
add.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, Add.class);
startActivity(intent);
}
});
}
private void turnGPSOn() {
String provider = android.provider.Settings.Secure.getString(
getContentResolver(),
android.provider.Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
if (!provider.contains("gps")) { // if gps is disabled
final Intent poke = new Intent();
poke.setClassName("com.android.settings",
"com.android.settings.widget.SettingsAppWidgetProvider");
poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
poke.setData(Uri.parse("3"));
sendBroadcast(poke);
ToastLoadShout("Turning GPS on..");
}
}
public void ReNewCoordinates(){
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
// Called when a new location is found by the network location provider.
lat = (location.getLatitude());
lon = (location.getLongitude());
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status,Bundle extras) {}};
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
我这里有HTC的日志:
08-01 18:46:29.929: I/Process(4007): Sending signal. PID: 4007 SIG: 9
08-01 18:46:32.031: D/skia(4024): new locale en-Latn-GB
08-01 18:46:32.141: W/GooglePlayServicesUtil(4024): Google Play services out of date. Requires 3159100 but found 2012110
08-01 18:46:32.151: W/GooglePlayServicesUtil(4024): Google Play services out of date. Requires 3159100 but found 2012110
08-01 18:46:32.151: W/GooglePlayServicesUtil(4024): Google Play services out of date. Requires 3159100 but found 2012110
08-01 18:46:32.161: W/GooglePlayServicesUtil(4024): Google Play services out of date. Requires 3159100 but found 2012110
08-01 18:46:32.171: W/GooglePlayServicesUtil(4024): Google Play services out of date. Requires 3159100 but found 2012110
08-01 18:46:32.231: W/GooglePlayServicesUtil(4024): Google Play services out of date. Requires 3159100 but found 2012110
08-01 18:46:32.231: D/AndroidRuntime(4024): Shutting down VM
08-01 18:46:32.231: W/dalvikvm(4024): threadid=1: thread exiting with uncaught exception (group=0x40b10930)
08-01 18:46:32.241: E/AndroidRuntime(4024): FATAL EXCEPTION: main
08-01 18:46:32.241: E/AndroidRuntime(4024): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.free/com.example.free.MainActivity}: java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized
08-01 18:46:32.241: E/AndroidRuntime(4024): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2308)
08-01 18:46:32.241: E/AndroidRuntime(4024): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358)
08-01 18:46:32.241: E/AndroidRuntime(4024): at android.app.ActivityThread.access$600(ActivityThread.java:153)
08-01 18:46:32.241: E/AndroidRuntime(4024): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
08-01 18:46:32.241: E/AndroidRuntime(4024): at android.os.Handler.dispatchMessage(Handler.java:99)
08-01 18:46:32.241: E/AndroidRuntime(4024): at android.os.Looper.loop(Looper.java:137)
08-01 18:46:32.241: E/AndroidRuntime(4024): at android.app.ActivityThread.main(ActivityThread.java:5227)
08-01 18:46:32.241: E/AndroidRuntime(4024): at java.lang.reflect.Method.invokeNative(Native Method)
08-01 18:46:32.241: E/AndroidRuntime(4024): at java.lang.reflect.Method.invoke(Method.java:511)
08-01 18:46:32.241: E/AndroidRuntime(4024): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
08-01 18:46:32.241: E/AndroidRuntime(4024): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
08-01 18:46:32.241: E/AndroidRuntime(4024): at dalvik.system.NativeStart.main(Native Method)
08-01 18:46:32.241: E/AndroidRuntime(4024): Caused by: java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized
08-01 18:46:32.241: E/AndroidRuntime(4024): at com.google.android.gms.internal.x.b(Unknown Source)
08-01 18:46:32.241: E/AndroidRuntime(4024): at com.google.android.gms.maps.model.BitmapDescriptorFactory.aX(Unknown Source)
08-01 18:46:32.241: E/AndroidRuntime(4024): at com.google.android.gms.maps.model.BitmapDescriptorFactory.fromResource(Unknown Source)
08-01 18:46:32.241: E/AndroidRuntime(4024): at com.example.free.MainActivity.onCreate(MainActivity.java:52)
08-01 18:46:32.241: E/AndroidRuntime(4024): at android.app.Activity.performCreate(Activity.java:5104)
08-01 18:46:32.241: E/AndroidRuntime(4024): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
08-01 18:46:32.241: E/AndroidRuntime(4024): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2262)
08-01 18:46:32.241: E/AndroidRuntime(4024): ... 11 more
以及模拟器的logcat:
08-01 15:27:48.565: E/Trace(981): error opening trace file: No such file or directory (2)
08-01 15:27:49.305: W/GooglePlayServicesUtil(981): Google Play services out of date. Requires 3159100 but found 1
08-01 15:27:49.326: W/GooglePlayServicesUtil(981): Google Play services out of date. Requires 3159100 but found 1
08-01 15:27:49.345: W/GooglePlayServicesUtil(981): Google Play services out of date. Requires 3159100 but found 1
08-01 15:27:49.366: W/GooglePlayServicesUtil(981): Google Play services out of date. Requires 3159100 but found 1
08-01 15:27:49.385: W/GooglePlayServicesUtil(981): Google Play services out of date. Requires 3159100 but found 1
08-01 15:27:49.565: D/dalvikvm(981): GC_CONCURRENT freed 200K, 4% free 8223K/8519K, paused 36ms+5ms, total 163ms
08-01 15:27:49.565: D/dalvikvm(981): WAIT_FOR_CONCURRENT_GC blocked 88ms
08-01 15:27:49.745: W/GooglePlayServicesUtil(981): Google Play services out of date. Requires 3159100 but found 1
08-01 15:27:49.745: D/AndroidRuntime(981): Shutting down VM
08-01 15:27:49.755: W/dalvikvm(981): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
08-01 15:27:49.765: E/AndroidRuntime(981): FATAL EXCEPTION: main
08-01 15:27:49.765: E/AndroidRuntime(981): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.free/com.example.free.MainActivity}: java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized
08-01 15:27:49.765: E/AndroidRuntime(981): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
08-01 15:27:49.765: E/AndroidRuntime(981): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
08-01 15:27:49.765: E/AndroidRuntime(981): at android.app.ActivityThread.access$600(ActivityThread.java:130)
08-01 15:27:49.765: E/AndroidRuntime(981): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
08-01 15:27:49.765: E/AndroidRuntime(981): at android.os.Handler.dispatchMessage(Handler.java:99)
08-01 15:27:49.765: E/AndroidRuntime(981): at android.os.Looper.loop(Looper.java:137)
08-01 15:27:49.765: E/AndroidRuntime(981): at android.app.ActivityThread.main(ActivityThread.java:4745)
08-01 15:27:49.765: E/AndroidRuntime(981): at java.lang.reflect.Method.invokeNative(Native Method)
08-01 15:27:49.765: E/AndroidRuntime(981): at java.lang.reflect.Method.invoke(Method.java:511)
08-01 15:27:49.765: E/AndroidRuntime(981): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-01 15:27:49.765: E/AndroidRuntime(981): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-01 15:27:49.765: E/AndroidRuntime(981): at dalvik.system.NativeStart.main(Native Method)
08-01 15:27:49.765: E/AndroidRuntime(981): Caused by: java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized
08-01 15:27:49.765: E/AndroidRuntime(981): at com.google.android.gms.internal.x.b(Unknown Source)
08-01 15:27:49.765: E/AndroidRuntime(981): at com.google.android.gms.maps.model.BitmapDescriptorFactory.aX(Unknown Source)
08-01 15:27:49.765: E/AndroidRuntime(981): at com.google.android.gms.maps.model.BitmapDescriptorFactory.fromResource(Unknown Source)
08-01 15:27:49.765: E/AndroidRuntime(981): at com.example.free.MainActivity.onCreate(MainActivity.java:52)
08-01 15:27:49.765: E/AndroidRuntime(981): at android.app.Activity.performCreate(Activity.java:5008)
08-01 15:27:49.765: E/AndroidRuntime(981): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
08-01 15:27:49.765: E/AndroidRuntime(981): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
08-01 15:27:49.765: E/AndroidRuntime(981): ... 11 more
08-01 15:28:19.685: I/Process(981): Sending signal. PID: 981 SIG: 9
08-01 15:52:15.355: E/Trace(1058): error opening trace file: No such file or directory (2)
08-01 15:52:16.015: W/GooglePlayServicesUtil(1058): Google Play services out of date. Requires 3159100 but found 1
08-01 15:52:16.025: W/GooglePlayServicesUtil(1058): Google Play services out of date. Requires 3159100 but found 1
08-01 15:52:16.055: W/GooglePlayServicesUtil(1058): Google Play services out of date. Requires 3159100 but found 1
08-01 15:52:16.075: W/GooglePlayServicesUtil(1058): Google Play services out of date. Requires 3159100 but found 1
08-01 15:52:16.095: W/GooglePlayServicesUtil(1058): Google Play services out of date. Requires 3159100 but found 1
08-01 15:52:16.265: D/dalvikvm(1058): GC_CONCURRENT freed 206K, 4% free 8223K/8519K, paused 76ms+5ms, total 157ms
08-01 15:52:16.265: D/dalvikvm(1058): WAIT_FOR_CONCURRENT_GC blocked 31ms
08-01 15:52:16.326: W/GooglePlayServicesUtil(1058): Google Play services out of date. Requires 3159100 but found 1
08-01 15:52:16.335: D/AndroidRuntime(1058): Shutting down VM
08-01 15:52:16.335: W/dalvikvm(1058): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
08-01 15:52:16.355: E/AndroidRuntime(1058): FATAL EXCEPTION: main
08-01 15:52:16.355: E/AndroidRuntime(1058): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.free/com.example.free.MainActivity}: java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized
08-01 15:52:16.355: E/AndroidRuntime(1058): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
08-01 15:52:16.355: E/AndroidRuntime(1058): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
08-01 15:52:16.355: E/AndroidRuntime(1058): at android.app.ActivityThread.access$600(ActivityThread.java:130)
08-01 15:52:16.355: E/AndroidRuntime(1058): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
08-01 15:52:16.355: E/AndroidRuntime(1058): at android.os.Handler.dispatchMessage(Handler.java:99)
08-01 15:52:16.355: E/AndroidRuntime(1058): at android.os.Looper.loop(Looper.java:137)
08-01 15:52:16.355: E/AndroidRuntime(1058): at android.app.ActivityThread.main(ActivityThread.java:4745)
08-01 15:52:16.355: E/AndroidRuntime(1058): at java.lang.reflect.Method.invokeNative(Native Method)
08-01 15:52:16.355: E/AndroidRuntime(1058): at java.lang.reflect.Method.invoke(Method.java:511)
08-01 15:52:16.355: E/AndroidRuntime(1058): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-01 15:52:16.355: E/AndroidRuntime(1058): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-01 15:52:16.355: E/AndroidRuntime(1058): at dalvik.system.NativeStart.main(Native Method)
08-01 15:52:16.355: E/AndroidRuntime(1058): Caused by: java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized
08-01 15:52:16.355: E/AndroidRuntime(1058): at com.google.android.gms.internal.x.b(Unknown Source)
08-01 15:52:16.355: E/AndroidRuntime(1058): at com.google.android.gms.maps.model.BitmapDescriptorFactory.aX(Unknown Source)
08-01 15:52:16.355: E/AndroidRuntime(1058): at com.google.android.gms.maps.model.BitmapDescriptorFactory.fromResource(Unknown Source)
08-01 15:52:16.355: E/AndroidRuntime(1058): at com.example.free.MainActivity.onCreate(MainActivity.java:52)
08-01 15:52:16.355: E/AndroidRuntime(1058): at android.app.Activity.performCreate(Activity.java:5008)
08-01 15:52:16.355: E/AndroidRuntime(1058): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
08-01 15:52:16.355: E/AndroidRuntime(1058): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
08-01 15:52:16.355: E/AndroidRuntime(1058): ... 11 more
听起来好像你正在测试的手机没有安装最新的Google Play Services pre-req 如果你看一看,你会发现一个章节讨论了如何确保设备安装了google play服务APK,如果没有,请指导用户安装
还请注意,运行API平台低于ANDROID 4.2.2(在第一节中引用)的仿真器不支持仿真器。请参阅检查手机上的Google Play服务。如果您遇到错误,它将显示一个从Google Play服务返回的错误对话框。我已经使用三星Galaxy S3上的Google Maps v2开发了我的应用程序,它工作正常。只需执行以下操作,检查Google play服务是否可用:
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
if(status == ConnectionResult.SUCCESS) {
//Success! Do what you want
}else{
GooglePlayServicesUtil.getErrorDialog(status, this, status);
}
它将检查google play服务,如果不可用,它将提示用户从google play下载这些服务
java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized
在我的例子中,我必须在初始化GoogleMap对象后调用BitmapDescriptorFactory
静态方法
阅读评论:
// This line initilizes the map asynchronously. It requires implementation
// of OnMapReadyCallback interface.
// And when it is inizilized, it calls onMapReady(GoogleMap googleMap)
mapFragment.getMapAsync(this);
// The following method is implemented in my activity
@Override
public void onMapReady(GoogleMap googleMap) {
... some code ...
currentLocationIcon = BitmapDescriptorFactory.fromResource(R.drawable.report_location_current)
... some code ...
}
是否启用了总账模式?GoogleMap2库是如何包含在您的项目中的?我刚刚导入了google服务:像那样:导入→ 安卓→ 将现有Android代码导入工作区。如何启用该GL模式?我没听说过。要启用GL模式,请将此代码放入AndroidManifest中,以便与google服务良好配合,您必须将整个google-play-services_库导入到您的类似项目的库中。如何实现这些方法?我需要添加一个库还是什么?因为它告诉我没有“isGooglePlayServicesAvailable();”之类的东西。例如,有没有其他方法可以使用地图并避免要求用户下载sdk?“isGooglePlayServicesAvailable()”可以在com.google.android.gms.common中找到,如下所示:如果您将它添加到项目中,它应该是google Play Services库的一部分。如果没有,可以通过另一种方式在{SDK Dir}\extras\googleAs中找到它,不是真的,至少不是官方的。你也无法在游戏市场上搜索它,因为它是隐藏的。它不是SDK,而是Google Play Services APK,用户甚至需要使用最新的Google Maps v2实现,所以大多数用户应该已经拥有了它anyway@NirPes为了调用
GooglePlayServicesUtil.isGooglePlayServicesAvailable(上下文)
您必须使用导入com.google.android.gms.common.GooglePlayServicesUtil代码>
GoogleApiAvailability googleApiAvailability=GoogleApiAvailability.getInstance();
int status=googleApiAvailability.isGooglePlayServicesAvailable(getActivity());
if (status != ConnectionResult.SUCCESS) {
int requestCode = 10;
Dialog dialog = googleApiAvailability.getErrorDialog(getActivity(),status,requestCode);
dialog.show();
}else{}