android - google-play-services_lib 스튜디오 구글 맵스 안드로이드 API v2가 GooglePlayServicesNotAvailableException을 던졌습니다. 구식 인 SupportMapFragment.getMap ()이 null을 반환합니다.


1 Answers

해당 링크 하단에 설명 된대로; http://developer.android.com/google/play-services/setup.html

그리고 이것을 올바르게 처리 할 수있는 샘플 코드가 있습니다.

int checkGooglePlayServices =    GooglePlayServicesUtil.isGooglePlayServicesAvailable(mContext);
    if (checkGooglePlayServices != ConnectionResult.SUCCESS) {
    // google play services is missing!!!!
    /* Returns status code indicating whether there was an error. 
    Can be one of following in ConnectionResult: SUCCESS, SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, SERVICE_DISABLED, SERVICE_INVALID.
    */
       GooglePlayServicesUtil.getErrorDialog(checkGooglePlayServices, mActivity, 1122).show();
    }
google map sdk for android

Android Support Library를 사용하여 새로운 Google Maps Android API v2를 응용 프로그램에 통합하려고합니다. 나는 일하기 위해 어딘가로 가려고 많은 반복을 거쳤으며, 이제 나는 포기하고 내가 여기서 물어야한다고 생각했다.

API 콘솔로 이동하여 프로젝트를 만들고 Android 용 Google Maps API v2를 사용하고 필요에 따라 디버그 KEY를 만들어 매니페스트에 붙여 넣었습니다. 인증 문제 또는 그런 문제가 없습니다. 확실히 나는이 권리를 확실히했다.

내 프로젝트의 libs 폴더에 android-support-v4.jar (프로젝트 마우스 오른쪽 버튼 클릭 -> android-support-v4.jar > Add Support Library ...)을 입력합니다. 이클립스에서 파일 -> 가져 오기 -> Android-> 기존 Android 코드를 작업 공간으로 가져 와서 android-sdk / google / google_play_services / libproject / google-play-services_lib의 최신 (3 부)을 가져 왔습니다. 그런 다음 프로젝트에 종속성 라이브러리로 추가했습니다 (프로젝트 오른쪽 클릭 -> 속성 -> Android-> 라이브러리 종속성으로 하단에 추가).

나의 명단에는 다음과 같은 것들이 있습니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>
    <permission
      android:name="myapp.permission.MAPS_RECEIVE"
      android:protectionLevel="signature"/>

    <All the uses-permission required like INTERNET, ACCESS_NETWORK_STATE, WRITE_EXTERNAL_STORAGE, FINE AND COARSE LOCATION, etc>
    <uses-permission android:name="myapp.permission.MAPS_RECEIVE"/>
    <uses-feature android:glEsVersion="0x00020000" android:required="true"/>
    <application ...>
        ...
        <uses-library android:name="com.google.android.maps" />
        <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AI..."/>
    </application>

내 mainview.xml 있음 :

<fragment
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/map"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   class="com.google.android.gms.maps.SupportMapFragment" />

이제 MainView.java에 내가 가지고있는 :

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;

public class MainView extends FragmentActivity ... {
    private GoogleMap mMap;

    @Override
    protected void onResume() {
        ...
        Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.map);
        SupportMapFragment mapFragment = (SupportMapFragment)fragment;
        mMap = mapFragment.getMap();
        //PROBLEM: mMap is null here even though mapFragment is not
    }
}

그런 다음 내용 뷰를 설정 한 후 onCreate 추가 할 조각을 초기화해야한다고 생각했습니다.

//Fragments
FragmentManager manager = getSupportFragmentManager(); 
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.map, SupportMapFragment.newInstance());
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.commit();

그렇다면 어쩌면 SupportMapFragment 아니지만 실제 조각을 참조해야하며 내 onResume 에서 언급 했어야합니다.

Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.map);
SupportMapFragment mapFragment = (SupportMapFragment)fragment;

//Fragments
FragmentManager manager = getSupportFragmentManager(); 
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.map, mapFragment);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.commit();

mMap = mapFragment.getMap();

mMap 이후 mMap 은 다시 null입니다.

그런 다음 MapsInitializer 클래스가 있다는 것을 알았 기 때문에 먼저 호출해야한다고 생각했습니다.

그래서 위의 코드에서 조각을 얻기 전에 코드를 추가했습니다.

try {
    MapsInitializer.initialize(this);
} catch (GooglePlayServicesNotAvailableException e) {
    e.printStackTrace();
}

이 Logcat으로 경고 메시지가 표시됩니다 (313 행은 MapsInitializer.initialize(this) 임).

com.google.android.gms.common.GooglePlayServicesNotAvailableException
    at com.google.android.gms.internal.n.c(Unknown Source)
    at com.google.android.gms.internal.n.a(Unknown Source)
    at com.google.android.gms.maps.MapsInitializer.initialize(Unknown Source)
    at myapp.activities.MainView.inflateSelectedViewAndSetData(MainView.java:313)
    at myapp.activities.MainView.onClick(MainView.java:642)
    at android.view.View.performClick(View.java:3153)
    at android.view.View$PerformClick.run(View.java:12148)
    at android.os.Handler.handleCallback(Handler.java:587)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:152)
    at android.app.ActivityThread.main(ActivityThread.java:4615)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:491)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
    at dalvik.system.NativeStart.main(Native Method)

내 시도를 통해 Logcat은 다음 경고를보고합니다.

Google Play services out of date.  Requires 2010100 but found 1013

이것은 범인이 될 수 있지만 해결책을 찾지 못했습니다.

이 시점에서 나는 아이디어가 없습니다. here 여러 스레드를 읽었습니다. here 있지만 제안 사항 중 어느 것도 문제를 해결하지 못했습니다. 후자의 경우에는 프로젝트 종속성을 포함하지 않고 jar 파일 만 포함하는 것이 좋습니다. 글쎄, google-play-services_lib/libs 폴더에서 google-play-services_lib/libs 하거나 해당 프로젝트에서 내 자신의 jar를 내보내는 방법으로는 작동하지 않습니다.

그런데 에뮬레이터가 아닌 실제 장치 (2.3.5 및 3.2 태블릿)에서 실행 중입니다.

전심으로 감사드립니다. :)

최신 정보:

해결책은 큐 비트 (qubit)입니다.

라이브러리 의존성을 내보내기까지는, 그것을 다루지 않아도되는 깔끔한 방법 (저장소를 다룰 때의 고통)은 FatJar 를 사용하고 google_play_services_lib 프로젝트를 내보내는 것입니다. 나는 다시 가져오고 싶지 않다), 그리고 그 출력 뚱뚱한 jar 파일을 프로젝트에 다른 jar 파일로 포함시킨다. 참고 : fat jar에 포함시킬 jar 파일을 선택할 때 annotations.jar 파일이 미리 포함되어 있고 중복 오류가 발생했기 때문에 annotations.jar 파일을 제외해야했습니다. 이제해야 할 일은 프로젝트의 libs 폴더에 google_play_services_rev_3.jar 을 포함시키는 것 google_play_services_rev_3.jar .



Related