[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 용으로 업데이트 됨) :

  1. ~/android-sdk/extras/google/google_play_services/libproject/google-play-services_lib/src/dummy.java포함 하는 파일 을 만듭니다 class dummy {}.
  2. 파일-> 모듈 가져 오기-> ~/android-sdk/extras/google/google_play_services/libproject/google-play-services_lib
  3. 기존 소스에서 모듈 생성
  4. 다음-> 다음-> 다음-> 다음-> 마침
  5. 파일-> 프로젝트 구조-> 모듈-> YourApp
  6. +-> Module Dependency-> Google-play-services_lib ( +버튼은 대화 상자의 오른쪽 상단에 있습니다.)
  7. +-> Jars 또는 디렉토리->~/android-sdk/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar
  8. up/ down화살표를 사용하여 <Module source>목록의 맨 아래 로 이동 하십시오.

원하는 dummy.java경우 삭제할 수 있습니다 .

편집 : 잠시 동안 이것을 사용한 후 작은 결함 / 버그가 있음을 발견했습니다. IDEA는 디렉토리 .iml에서 프로젝트 파일 을 열 수 없다고 불평 할 google-play-services_lib것입니다.하지만 거기에 프로젝트가 있다고 말하지 않았음에도 불구하고 말입니다. 이런 일이 발생하면 프로젝트를 다시 빌드하면 적어도 문제가 다시 발생할 때까지 문제가 해결됩니다.


답변

최신 정보

더 나은 이해를 위해 Commonsware MapV2 코드 스 니펫을 따르십시오.

(옴니버스 에디션에 있음)

https://github.com/commonsguy/cw-omnibus/tree/master/MapsV2

다음 스 니펫은 내 끝에서 잘 작동합니다 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


답변

나는 나를 위해 일한 해결책을 찾는 데 며칠이 걸렸던 동일한 문제에 직면했습니다.

  1. 프로젝트를 삭제 google-play-services_lib(오른쪽 삭제 프로젝트 클릭)
  2. Google지도 데모 ( MainActivity제 경우에는)가 포함 된 프로젝트를 삭제하세요.
  3. 프로젝트 google-play-services_lib (extras \ google \ google_play_services \ libproject \ google-play-services_lib)를 작업 공간에 복사 한 다음 일반 프로젝트 (파일-> 가져 오기-> 기존 프로젝트를 workspase로 가져 오기)로 가져옵니다.
  4. 지도를로드하려는 프로젝트를 마우스 오른쪽 버튼으로 클릭-> Android-> 추가 (라이브러리 아래) google-play-services_lib

다음과 같은 내용이 표시되어야합니다.

주목

참고 : 다음과 같은 것이 없어야합니다 (프로젝트는 작업 공간에서 참조되어야 함).

여기에 이미지 설명 입력

문제는 tow 프로젝트가 동일한 라이브러리를 참조하고 있다는 것입니다.


답변

이 시도

http://developer.android.com/tools/projects/projects-eclipse.html#ReferencingLibraryProject

방금 Google 서비스 프로젝트를 추가하고 프로젝트 속성-> Android에 참조를 추가했습니다.


답변

  1. 지금까지 데모는 다음 링크를 따라 작동 할 수 있습니다 .
  2. 예를 들어 데모에서도 작동 할 수 있습니다.

프로젝트의 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

앱을 실행하고 디버깅 할 수있는 물리적 개발 기기를 제공해야합니다. 에뮬레이터를 사용하지 마십시오. 작동하지 않습니다.