Android Support Library を使用して、新しい Google Maps Android API v2 をアプリケーションに組み込んでいます。どこかで機能するように何度も繰り返しましたが、今はあきらめて、ここで質問する必要があると考えました。
API コンソールに移動し、プロジェクトを作成し、Android 用の Google Maps API v2 を有効にし、必要に応じてデバッグ KEY を作成し、マニフェストに貼り付けました。認証の問題などはありません。私はこれを正しくやったと確信しています。
私のプロジェクトのlibs
フォルダーに入れましたandroid-support-v4.jar
(プロジェクトの右クリック-> Android->サポートライブラリの追加...)。Eclipse で、File->Import->Android->Existing Android Code Into Workspace を実行し、最新 (rev 3) の android-sdk/google/google_play_services/libproject/google-play-services_lib をインポートしました。次に、それを依存ライブラリとしてプロジェクトに追加しました(プロジェクトの右クリック->プロパティ-> 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
この後、再び 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
これが原因である可能性がありますが、解決策が見つかりませんでした。
この時点で、私はアイデアがありません。ここ、ここ、ここでいくつかのスレッドを読みましたが、どの提案も問題を解決しませんでした。後者では、プロジェクトの依存関係を含めず、jar ファイルのみを含めることをお勧めします。google-play-services.jar
まあ、それはフォルダーから使用するかgoogle-play-services_lib/libs
、そのプロジェクトから自分のjarファイルをエクスポートしても機能しませんでした。
ちなみに私はエミュレータではなく実機(2.3.5と3.2のタブレット)で動かしています。
どんな助けでも心から感謝します。:)
アップデート:
解決策は以下のキュービットです。
ライブラリの依存関係をエクスポートする限り、それを処理する必要がない適切な方法 (リポジトリを処理するときは面倒です) は、FatJarを使用してプロジェクトをエクスポートすることgoogle_play_services_lib
です (ローカル コピーを作成しませんでした。再インポートしたくない)、出力されたファット jar ファイルを別の jar ファイルとしてプロジェクトに含めます。注: どの jar ファイルをファット jar に含めるかを選択するとき、そのannotations.jar
ファイルは既に含まれており、重複のエラーを引き起こしていたため、除外する必要がありました。今私がしなければならないことはgoogle_play_services_rev_3.jar
、プロジェクトのlibs
フォルダーに を含めることだけです。