我正在尝试使用Google Maps API v2构建一个应用程序,但问题是,尽管我遵循了所有必需的说明,但应用程序仍在给我强行关闭。
这是android部分
import android.support.v4.app.FragmentActivity;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
public class GPSonMap extends FragmentActivity{
MapView map;
MapController controller;
LocationManager locationManager;
LocationListener listener;
PendingIntent pendingIntent ;
Criteria criteria;
MapOverlay overlay;
@Override
public void onCreate(Bundle onsaved)
{
super.onCreate(onsaved);
setContentView(R.layout.map);
Log.d("", "entered");
map = (MapView)findViewById(R.id.mapView);
}
这是XML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MapsActivity" >
<fragment
class="com.google.android.gms.maps.SupportMapFragment"
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
这是我的清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bachelor.bond"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="17" />
<!-- <permission
android:name="com.example.example.permission.MAPS_RECEIVE"
android:protectionLevel="signature"/>
<uses-permission android:name="com.bachelor.bond.permission.MAPS_RECEIVE"/>. -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<permission android:name="com.example.example.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.example.example.permission.C2D_MESSAGE" />
<!-- App receives GCM messages. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<!-- GCM connects to Google Services. -->
<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.READ_PHONE_STATE"/>
<!-- GCM requires a Google account. -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK"
/>
<uses-permission android:name="com.example.example.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Permission to vibrate -->
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION"/>
<permission
android:name="com.example.example.permission.MAPS_RECEIVE"
android:protectionLevel="signature"></permission>
<uses-feature
android:glEsVersion="0x00020000"
android:required="true"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<uses-library android:name="com.google.android.maps" />
<activity
android:name=".GPSonMap"
android:label="@string/app_name"
> <intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<uses-library android:name="com.google.android.maps" />
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.example.example" />
</intent-filter>
<receiver android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
</receiver>
<service android:name=".GCMIntentService" />
<activity android:name="Login"></activity>
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="****"/>
</application>
</manifest>
Log Cat输出
02-15 00:42:35.257: E/AndroidRuntime(2693): FATAL EXCEPTION: main
02-15 00:42:35.257: E/AndroidRuntime(2693): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bachelor.bond/com.dxample.example.GPSonMap}: android.view.InflateException: Binary XML file line #7: Error inflating class fragment
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.app.ActivityThread.access$600(ActivityThread.java:141)
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.os.Handler.dispatchMessage(Handler.java:99)
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.os.Looper.loop(Looper.java:137)
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.app.ActivityThread.main(ActivityThread.java:5039)
02-15 00:42:35.257: E/AndroidRuntime(2693): at java.lang.reflect.Method.invokeNative(Native Method)
02-15 00:42:35.257: E/AndroidRuntime(2693): at java.lang.reflect.Method.invoke(Method.java:511)
02-15 00:42:35.257: E/AndroidRuntime(2693): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-15 00:42:35.257: E/AndroidRuntime(2693): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-15 00:42:35.257: E/AndroidRuntime(2693): at dalvik.system.NativeStart.main(Native Method)
02-15 00:42:35.257: E/AndroidRuntime(2693): Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class fragment
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
02-15 00:42:35.257: E/AndroidRuntime(2693): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:270)
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.app.Activity.setContentView(Activity.java:1881)
02-15 00:42:35.257: E/AndroidRuntime(2693): at com.bachelor.bond.GPSonMap.onCreate(GPSonMap.java:54)
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.app.Activity.performCreate(Activity.java:5104)
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
02-15 00:42:35.257: E/AndroidRuntime(2693): ... 11 more
02-15 00:42:35.257: E/AndroidRuntime(2693): Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.google.android.gms.maps.SupportMapFragment: make sure class name exists, is public, and has an empty constructor that is public
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.support.v4.app.Fragment.instantiate(Fragment.java:401)
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.support.v4.app.Fragment.instantiate(Fragment.java:369)
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:272)
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676)
02-15 00:42:35.257: E/AndroidRuntime(2693): ... 21 more
02-15 00:42:35.257: E/AndroidRuntime(2693): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.maps.SupportMapFragment" on path: /system/framework/com.google.android.maps.jar:/data/app/com.bachelor.bond-1.apk
02-15 00:42:35.257: E/AndroidRuntime(2693): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:65)
02-15 00:42:35.257: E/AndroidRuntime(2693): at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
02-15 00:42:35.257: E/AndroidRuntime(2693): at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
02-15 00:42:35.257: E/AndroidRuntime(2693): at android.support.v4.app.Fragment.instantiate(Fragment.java:391)
02-15 00:42:35.257: E/AndroidRuntime(2693): ... 24 more
我面临的另一个问题是,当我尝试时
import com.google.android.gms.maps.MapFragment;
它给出了一个错误,它不会将包名称识别为com.google.android.gms
,所以我甚至无法使用GoogleMap
或MapFragment
。
那么有没有人对这两个问题有任何解决方案?
答案 0 :(得分:8)
如何通过Android上的Google Maps API v2显示GOOGLE地图。
请注意要设置Google Play服务和Manifest文件,包括多个权限和API密钥,都需要以下两种情况。
<强> 1。在(支持)片段中显示Google地图。
<强> main.xml中强>
<?xml version="1.0" encoding="utf-8"?>
<!-- This can go anywhere in your layout (see other demos for some examples). -->
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment"/>
<强> MainActivity.java 强>
/**
* This shows how to create a simple activity with a map and a marker on the map.
* <p>
* Notice how we deal with the possibility that the Google Play services APK is not
* installed/enabled/updated on a user's device.
*/
public class BasicMapActivity extends android.support.v4.app.FragmentActivity {
/**
* Note that this may be null if the Google Play services APK is not available.
*/
private GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setUpMapIfNeeded();
}
@Override
protected void onResume() {
super.onResume();
setUpMapIfNeeded();
}
/**
* Sets up the map if it is possible to do so (i.e., the Google Play services APK is correctly
* installed) and the map has not already been instantiated.. This will ensure that we only ever
* call {@link #setUpMap()} once when {@link #mMap} is not null.
* <p>
* If it isn't installed {@link SupportMapFragment} (and
* {@link com.google.android.gms.maps.MapView
* MapView}) will show a prompt for the user to install/update the Google Play services APK on
* their device.
* <p>
* A user can return to this Activity after following the prompt and correctly
* installing/updating/enabling the Google Play services. Since the Activity may not have been
* completely destroyed during this process (it is likely that it would only be stopped or
* paused), {@link #onCreate(Bundle)} may not be called again so we should call this method in
* {@link #onResume()} to guarantee that it will be called.
*/
private void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the map.
if (mMap == null) {
// Try to obtain the map from the SupportMapFragment.
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
.getMap();
// Check if we were successful in obtaining the map.
if (mMap != null) {
setUpMap();
}
}
}
/**
* This is where we can add markers or lines, add listeners or move the camera. In this case, we
* just add a marker near Africa.
* <p>
* This should only be called once and when we are sure that {@link #mMap} is not null.
*/
private void setUpMap() {
mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
}
}
<强> 2。在(支持)片段中显示MapView。
<强> main.xml中强>
<?xml version="1.0" encoding="utf-8"?>
<!-- This can go anywhere in your layout. -->
<com.google.android.gms.maps.MapView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<强> MainActivity.java 强>
/**
* This shows how to create a simple activity with a raw MapView and add a marker to it. This
* requires forwarding all the important lifecycle methods onto MapView.
*/
public class RawMapViewDemoActivity extends android.support.v4.app.FragmentActivity {
private MapView mMapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mMapView = (MapView) findViewById(R.id.map);
mMapView.onCreate(savedInstanceState);
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onPause() {
mMapView.onPause();
super.onPause();
}
@Override
protected void onDestroy() {
mMapView.onDestroy();
super.onDestroy();
}
@Override
public void onLowMemory() {
super.onLowMemory();
mMapView.onLowMemory();
}
}
答案 1 :(得分:3)
据推测,您尚未将Google Play服务库项目的引用添加到您的应用项目中。请参阅the Google Play Services SDK documentation,特别是标题为“设置项目以使用Google Play服务SDK”的部分。
答案 2 :(得分:3)
我发现你错过了代码中的几件事。
回答1:您的GPSonMAP.java必须修改如下;
public class GPSonMap extends android.support.v4.app.FragmentActivity{
GoogleMap googlemap; // "MapView map;" is wrong
//MapController controller; ==> it was depreciated.
LocationManager locationManager;
LocationListener listener;
PendingIntent pendingIntent ;
Criteria criteria;
//MapOverlay overlay; ==> it was depreciated.
SupportMapFragment fm; // add this
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map);
Log.d("", "entered");
//map = (MapView)findViewById(R.id.mapView); ==> delete it.
fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapView);
googleMap = fm.getMap();
}
}
修改上述内容后,按“Ctrl + Shft +(字母)O”,将导入一些必需的类。
答案2:布局中的xml文件必须修改如下;
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".GPSonMap" >
您的MainActivity不是MapsActivity,而是GPSonMap。
回答3 :您的清单文件与清单文件中描述的包名称与您的包名称不匹配。请将包名与相同的名称相匹配。
将“com.example.example”修改为您的包名。
复制并粘贴一些代码后,必须至少检查包名和类名。
答案 3 :(得分:0)
我遇到了这个问题并且浪费时间(超过1.5天的头发拉沮丧)。然后,我观看了一个YouTube视频,该视频无聊地执行了将Google Play服务添加到应用程序的说明。好吧,在从sdk管理器添加SDK后,在该视频中,他们使用了Eclipse“检查更新”。那个小小的魔法消失了,下载了一个SDK Manager不能做的jar文件!他们确实需要将这些添加到说明中,以挽救人们的挫败感。我很想从我的应用中删除谷歌地图。我使用1.0,我需要更新到2.0或沟渠地图。