2012-12-18 6 views
55

Google Maps Android API v2でカスタムアイコン付きのマーカーを取得しようとしています。 Googleが提供している例の1つを変更しました。私はこの方法setUpMap().「IBitmapDescriptorFactoryが初期化されていません」エラー

private void setUpMapIfNeeded() { 
    if (mMap == null) { 
     mMap = ((MapView) findViewById(R.id.map)).getMap(); 
     if (mMap != null) { 
      setUpMap(); 
     } 
    } 
} 

private void setUpMap() { 
    mMap.addMarker(new MarkerOptions() 
     .position(new LatLng(0, 0)) 
     .title("Marker") 
     .icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow))); 
} 

にRawMapViewDemoActivityに.icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow))を追加しました。しかし、私はいつも「IBitmapDescriptorFactoryが初期化されていない」そうです。

12-18 15:40:54.356: E/AndroidRuntime(12591): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mapdemo/com.example.mapdemo.RawMapViewDemoActivity}: java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized 
12-18 15:40:54.356: E/AndroidRuntime(12591): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at android.os.Looper.loop(Looper.java:137) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at android.app.ActivityThread.main(ActivityThread.java:4745) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at java.lang.reflect.Method.invokeNative(Native Method) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at java.lang.reflect.Method.invoke(Method.java:511) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at dalvik.system.NativeStart.main(Native Method) 
12-18 15:40:54.356: E/AndroidRuntime(12591): Caused by: java.lang.NullPointerException: IBitmapDescriptorFactory is not initialized 
12-18 15:40:54.356: E/AndroidRuntime(12591): at com.google.android.gms.internal.at.a(Unknown Source) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at com.google.android.gms.maps.model.BitmapDescriptorFactory.d(Unknown Source) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at com.google.android.gms.maps.model.BitmapDescriptorFactory.fromResource(Unknown Source) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at com.example.mapdemo.RawMapViewDemoActivity.setUpMap(RawMapViewDemoActivity.java:67) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at com.example.mapdemo.RawMapViewDemoActivity.setUpMapIfNeeded(RawMapViewDemoActivity.java:58) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at com.example.mapdemo.RawMapViewDemoActivity.onCreate(RawMapViewDemoActivity.java:43) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at android.app.Activity.performCreate(Activity.java:5008) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
12-18 15:40:54.356: E/AndroidRuntime(12591): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
12-18 15:40:54.356: E/AndroidRuntime(12591): ... 11 more 

BitmapDescriptorFactoryでは、それは言う:

  • 待ち:

    先立ち、このクラスから任意のメソッドを使用して、あなたは、このクラスが初期化されることを保証するために、次のいずれかを実行しなければなりませんアプリケーションに追加したMapFragmentやMapViewからGoogleMapを利用できるようにします。 getMap()メソッドを呼び出し、返されたオブジェクトがnullでないことを確認することで、GoogleMapが利用可能であることを確認できます。

  • MapsInitializer.initialize(Context)を呼び出します。 com.google.android.gms.common.GooglePlayServicesNotAvailableException GooglePlayServicesNotAvailableExceptionがスローされない限り、このクラスは正しく初期化されます。

私は最初のものをしましたが、それでもこのエラーを取得。助言がありますか? onCreate()

try { 
     MapsInitializer.initialize(getApplicationContext()); 
    } catch (GooglePlayServicesNotAvailableException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+0

エラーを再現し、ソースコードをどこかに投稿できるサンプルプロジェクトを作成することをお勧めします。これは 'fromResource()'のバグのように感じますが、再現可能なテストケースが必要です。 – CommonsWare

+0

'MapInitializer.initialize()'を呼び出すことは私のためのトリックです。 – Ash

+0

私は同じ問題に直面しています..java.lang.NullPointerException:IBitmapDescriptorFactoryが初期化されていません – sanjay

答えて

89

コールMapsInitializer.initialize(getApplicationContext()) 'onMapReady()'、GoogleマップのAPIが提供するコールバックと呼ばれるようにあなたのコードを移動します。

これは機能します。

+0

@Greeny例外をスローする –

+6

これは良い答えですが、それが実際に最初に起こる理由を知ることは素晴らしいことです。マップチュートリアルAFAIK – avalancha

+17

には記載されていません。このコード行を追加したにもかかわらず、この例外を伴う一部の電話機でアプリケーションがクラッシュします。GooglePlayストアがインストールされていないか、最新のものではないことが判明しました。マップが利用可能かどうかを確認する方法はありますか? –

20

コールで

+3

メッセージが表示されますが、例外はこのtry catchブロックにスローされません。 – Apqu

-1
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 {} 
9

に次onCreate()

+1

onCreateに配置してs5(およびエミュレータ)で失敗したときに、Galaxy s3上で動作しました(onCreateでMapsInitializerを起動したとき)。 onMapReadyに移動しました。 –

+1

これは実際に正しい答えです。他のソリューションはすべての携帯電話で動作しません。 –

1

これは私にとって起こりました。私の場合、私が見つけたものは、Googleプレイサービスがインストールされていないことでした。インストールされてアプリがクラッシュしなかった。だから1つはtryとcatchブロックでそうするダイアログを置くことができるかもしれません。

関連する問題