[android] android.gms.maps.MapFragment를 인스턴스화 할 수 없습니다.
매우 간단한 활동으로 Google지도 android v2로 데모를 시도합니다. Google 페이지에서 코드를 복사합니다.
https://developers.google.com/maps/documentation/android/start#adding_the_api_key_to_your_application
활동 :
package com.example.mapdemo;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
레이아웃 :
<?xml version="1.0" encoding="utf-8"?>
<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.MapFragment"/>
페이지에 따라 API 키를 신청하고 다음과 같이 androidmanifest.xml 파일을 수정했습니다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.wenhai.driverschool"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.INTERNET" />
<!-- add for map2 -->
<permission
android:name="com.example.mapdemo.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="com.example.mapdemo.permission.MAPS_RECEIVE" />
<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" />
<!-- Maps API needs OpenGL ES 2.0. -->
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyDVAF4WaVSVRDKJx87It8OSFP5txQcPabc" />
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
또한 Eclipse의 google-play-services_lib에 내 앱을 참조합니다.
그러나 매번 다음과 같이 logcat에 오류가보고됩니다.
2-05 16:22:53.609: E/AndroidRuntime(21623): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.wenhai.driverschool/com.wenhai.driverschool.MainActivity}: android.view.InflateException: Binary XML file line #2: Error inflating class fragment
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.app.ActivityThread.access$600(ActivityThread.java:127)
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.os.Handler.dispatchMessage(Handler.java:99)
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.os.Looper.loop(Looper.java:137)
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.app.ActivityThread.main(ActivityThread.java:4441)
12-05 16:22:53.609: E/AndroidRuntime(21623): at java.lang.reflect.Method.invokeNative(Native Method)
12-05 16:22:53.609: E/AndroidRuntime(21623): at java.lang.reflect.Method.invoke(Method.java:511)
12-05 16:22:53.609: E/AndroidRuntime(21623): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
12-05 16:22:53.609: E/AndroidRuntime(21623): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
12-05 16:22:53.609: E/AndroidRuntime(21623): at dalvik.system.NativeStart.main(Native Method)
12-05 16:22:53.609: E/AndroidRuntime(21623): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:697)
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.view.LayoutInflater.inflate(LayoutInflater.java:466)
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
12-05 16:22:53.609: E/AndroidRuntime(21623): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:255)
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.app.Activity.setContentView(Activity.java:1835)
12-05 16:22:53.609: E/AndroidRuntime(21623): at com.wenhai.driverschool.MainActivity.onCreate(MainActivity.java:11)
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.app.Activity.performCreate(Activity.java:4465)
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)
12-05 16:22:53.609: E/AndroidRuntime(21623): ... 11 more
12-05 16:22:53.609: E/AndroidRuntime(21623): Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.google.android.gms.maps.MapFragment: make sure class name exists, is public, and has an empty constructor that is public
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.app.Fragment.instantiate(Fragment.java:581)
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.app.Fragment.instantiate(Fragment.java:549)
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.app.Activity.onCreateView(Activity.java:4235)
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:673)
12-05 16:22:53.609: E/AndroidRuntime(21623): ... 20 more
12-05 16:22:53.609: E/AndroidRuntime(21623): Caused by: java.lang.ClassNotFoundException: com.google.android.gms.maps.MapFragment
12-05 16:22:53.609: E/AndroidRuntime(21623): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
12-05 16:22:53.609: E/AndroidRuntime(21623): at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
12-05 16:22:53.609: E/AndroidRuntime(21623): at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
12-05 16:22:53.609: E/AndroidRuntime(21623): at android.app.Fragment.instantiate(Fragment.java:571)
12-05 16:22:53.609: E/AndroidRuntime(21623): ... 23 more
그 이유를 모르겠습니다.
내 프로젝트에 google-play-services.jar을 추가하면 다른 오류가보고됩니다.
12-05 16:34:23.269: E/AndroidRuntime(22638): FATAL EXCEPTION: main
12-05 16:34:23.269: E/AndroidRuntime(22638): java.lang.NoClassDefFoundError: com.google.android.gms.R$styleable
12-05 16:34:23.269: E/AndroidRuntime(22638): at com.google.android.gms.maps.GoogleMapOptions.createFromAttributes(Unknown Source)
12-05 16:34:23.269: E/AndroidRuntime(22638): at com.google.android.gms.maps.MapFragment.onInflate(Unknown Source)
12-05 16:34:23.269: E/AndroidRuntime(22638): at android.app.Activity.onCreateView(Activity.java:4242)
12-05 16:34:23.269: E/AndroidRuntime(22638): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:673)
12-05 16:34:23.269: E/AndroidRuntime(22638): at android.view.LayoutInflater.inflate(LayoutInflater.java:466)
12-05 16:34:23.269: E/AndroidRuntime(22638): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
12-05 16:34:23.269: E/AndroidRuntime(22638): at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
12-05 16:34:23.269: E/AndroidRuntime(22638): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:255)
12-05 16:34:23.269: E/AndroidRuntime(22638): at android.app.Activity.setContentView(Activity.java:1835)
12-05 16:34:23.269: E/AndroidRuntime(22638): at com.wenhai.driverschool.MainActivity.onCreate(MainActivity.java:11)
12-05 16:34:23.269: E/AndroidRuntime(22638): at android.app.Activity.performCreate(Activity.java:4465)
12-05 16:34:23.269: E/AndroidRuntime(22638): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
12-05 16:34:23.269: E/AndroidRuntime(22638): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)
12-05 16:34:23.269: E/AndroidRuntime(22638): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
12-05 16:34:23.269: E/AndroidRuntime(22638): at android.app.ActivityThread.access$600(ActivityThread.java:127)
12-05 16:34:23.269: E/AndroidRuntime(22638): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
12-05 16:34:23.269: E/AndroidRuntime(22638): at android.os.Handler.dispatchMessage(Handler.java:99)
12-05 16:34:23.269: E/AndroidRuntime(22638): at android.os.Looper.loop(Looper.java:137)
12-05 16:34:23.269: E/AndroidRuntime(22638): at android.app.ActivityThread.main(ActivityThread.java:4441)
12-05 16:34:23.269: E/AndroidRuntime(22638): at java.lang.reflect.Method.invokeNative(Native Method)
12-05 16:34:23.269: E/AndroidRuntime(22638): at java.lang.reflect.Method.invoke(Method.java:511)
12-05 16:34:23.269: E/AndroidRuntime(22638): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
12-05 16:34:23.269: E/AndroidRuntime(22638): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
12-05 16:34:23.269: E/AndroidRuntime(22638): at dalvik.system.NativeStart.main(Native Method)
누구든지 이것에 대해 나를 도울 수 있습니까?
답변
IntelliJ IDEA (IntelliJ 12 용으로 업데이트 됨) :
- 를
~/android-sdk/extras/google/google_play_services/libproject/google-play-services_lib/src/dummy.java
포함 하는 파일 을 만듭니다class dummy {}
. - 파일-> 모듈 가져 오기->
~/android-sdk/extras/google/google_play_services/libproject/google-play-services_lib
- 기존 소스에서 모듈 생성
- 다음-> 다음-> 다음-> 다음-> 마침
- 파일-> 프로젝트 구조-> 모듈-> YourApp
- +-> Module Dependency-> Google-play-services_lib ( +버튼은 대화 상자의 오른쪽 상단에 있습니다.)
- +-> Jars 또는 디렉토리->
~/android-sdk/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar
- up/ down화살표를 사용하여
<Module source>
목록의 맨 아래 로 이동 하십시오.
원하는 dummy.java
경우 삭제할 수 있습니다 .
편집 : 잠시 동안 이것을 사용한 후 작은 결함 / 버그가 있음을 발견했습니다. IDEA는 디렉토리 .iml
에서 프로젝트 파일 을 열 수 없다고 불평 할 google-play-services_lib
것입니다.하지만 거기에 프로젝트가 있다고 말하지 않았음에도 불구하고 말입니다. 이런 일이 발생하면 프로젝트를 다시 빌드하면 적어도 문제가 다시 발생할 때까지 문제가 해결됩니다.
답변
최신 정보
더 나은 이해를 위해 Commonsware MapV2 코드 스 니펫을 따르십시오.
(옴니버스 에디션에 있음)
다음 스 니펫은 내 끝에서 잘 작동합니다 SupportMapFragment
.
프로젝트 에 추가하는 것을 잊지 google-play-services.jar
마십시오.
MainActivity.java
package com.example.newmapview;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import com.google.android.gms.maps.SupportMapFragment;
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SupportMapFragment fragment = new SupportMapFragment();
getSupportFragmentManager().beginTransaction()
.add(android.R.id.content, fragment).commit();
}
}
manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.newmapview"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" />
<permission
android:name="com.example.newmapview.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="com.example.newmapview.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<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" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.newmapview.MainActivity"
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="XXXXX" />
</application>
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
</manifest>
결과는 다음과 같습니다.
이것이 도움이되기를 바랍니다.
답변
레이아웃을 다음으로 바꾸십시오.
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="wrap_content"
android:layout_height="match_parent" />
11 미만의 API에 대해 SupportMapFragment를 사용해야합니다!
Aurel
답변
나는 나를 위해 일한 해결책을 찾는 데 며칠이 걸렸던 동일한 문제에 직면했습니다.
- 프로젝트를 삭제
google-play-services_lib
(오른쪽 삭제 프로젝트 클릭) - Google지도 데모 (
MainActivity
제 경우에는)가 포함 된 프로젝트를 삭제하세요. - 프로젝트 google-play-services_lib (extras \ google \ google_play_services \ libproject \ google-play-services_lib)를 작업 공간에 복사 한 다음 일반 프로젝트 (파일-> 가져 오기-> 기존 프로젝트를 workspase로 가져 오기)로 가져옵니다.
- 지도를로드하려는 프로젝트를 마우스 오른쪽 버튼으로 클릭-> Android-> 추가 (라이브러리 아래) google-play-services_lib
다음과 같은 내용이 표시되어야합니다.
참고 : 다음과 같은 것이 없어야합니다 (프로젝트는 작업 공간에서 참조되어야 함).
문제는 tow 프로젝트가 동일한 라이브러리를 참조하고 있다는 것입니다.
답변
이 시도
http://developer.android.com/tools/projects/projects-eclipse.html#ReferencingLibraryProject
방금 Google 서비스 프로젝트를 추가하고 프로젝트 속성-> Android에 참조를 추가했습니다.
답변
- 지금까지 데모는 다음 링크를 따라 작동 할 수 있습니다 .
- 예를 들어 데모에서도 작동 할 수 있습니다.
프로젝트의 libs 디렉토리에 두 개의 jar를 추가하십시오. 아래 정보를 따르십시오. 특히 다음 사항이 필요하다고 생각합니다.
- “google-play-services_lib”프로젝트의 실제 소스를 가져 와서 Android 라이브러리로 연결합니다.
- 프로젝트-> 속성-> Android-> 라이브러리, 추가-> google-play-services_lib를 통해이 작업을 수행합니다 (프로젝트를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택한 다음 Android를 선택).
- 나를 위해 작동하지 않는 프로젝트의 “Java Build Path”를 통해 종속 프로젝트로 추가하지 마십시오.
- google-play-services.jar 및 android-support-v4.jar를 샘플 프로젝트의 “libs”폴더에 추가하고 “Build Path-> Configure Build Path-> Libraries”에서 “External External JARs”로 추가합니다. .
샘플 코드를 사용하려고 할 때와 똑같은 오류가 발생했기 때문에이 두 번째 단계가 필요하다는 것을 알았습니다. 첫 번째 단계는 실제 프로젝트에서 com.google.android.gms.R $ styleable의 NoClassDefFoundError를 피하기 위해 필요했습니다.
또한 샘플 코드가 작동하기 전에 클린 빌드를 수행하고 장치에서 앱을 제거해야했습니다 (이전 테스트 시도에서).
도와 주셔서 감사합니다.
답변
아마도 당신은 이것을 강조해야합니다 :
참고 : Google Play 서비스는 Android 에뮬레이터에서 지원되지 않습니다. API를 사용하여 개발하려면 Android 휴대 전화 또는 태블릿과 같은 개발 기기를 제공해야합니다.
http://developer.android.com/google/play-services/setup.html
앱을 실행하고 디버깅 할 수있는 물리적 개발 기기를 제공해야합니다. 에뮬레이터를 사용하지 마십시오. 작동하지 않습니다.