6

質問の説明、最初にこれを読んでください

Android2.3からAndroid4.0以降のデバイスで実行されているユーザーの位置を表示するシンプルなアプリを取得しようとしています。マップは実際のAndroid2.3デバイスには表示されません。

このアプリは現在、Android 4.0以降のデバイスで問題なく実行し、希望どおりに地図を表示できます。

Android 4.0以降では問題なく地図を表示できるので、GoogleMapsV2の設定や権限に問題はないと思います。

ただし、Android 2.3デバイスで試してみると、以下に示すスクリーンショットのようにマップ領域が空白になります。

ここに画像の説明を入力してください

このアプリは、ActionBarSherlock、Google Maps API v2、およびSupportMapFragmentを使用します。SDK 17、最小SDK10を対象としたビルド。


コードスニペット

関連する部分だけを表示するためにコードを貼り付けてトリミングしました。他に必要な場合はコメントを残してください。

activity_layout.xml

<fragment
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="@dimen/incident_padding_right" />

Activity.java

import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMarkerDragListener;
import com.google.android.gms.maps.SupportMapFragment;

public class Activity extends SherlockFragmentActivity{

private static GoogleMap map;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.activity_layout);

            ............

        //Set up map view
        map = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map)).getMap();

            ............

        OnMarkerDragListener markerDragListener = new OnMarkerDragListener() {

            @Override
            public void onMarkerDragStart(Marker marker) {
                // Called when the marker drag is started

            }

            @Override
            public void onMarkerDragEnd(Marker marker) {
                // Called when the marker is dropped down.
                coords[0] = marker.getPosition().latitude;
                coords[1] = marker.getPosition().longitude;
                RestoreUIwithSavedLocation(coords);
                Log.d(TAG, "Pin Dropped at: " + coords[0] + ", " + coords[1]);
            }

            @Override
            public void onMarkerDrag(Marker marker) {

            }
        };

        map.setOnMarkerDragListener(markerDragListener);
}

実際のAndroid2.3デバイスで実行している場合のLogcat:

01-04 21:16:52.020: D/dalvikvm(19074): VFY: dead code 0x0014-0018 in Lcom/google/android/gms/common/GooglePlayServicesUtil;.b (Landroid/content/res/Resources;)Z
01-04 21:16:52.150: W/dalvikvm(19074): Unable to resolve superclass of Lmaps/p/s; (427)
01-04 21:16:52.150: W/dalvikvm(19074): Link of class 'Lmaps/p/s;' failed
01-04 21:16:52.150: W/dalvikvm(19074): Unable to resolve superclass of Lmaps/y/bo; (3820)
01-04 21:16:52.150: W/dalvikvm(19074): Link of class 'Lmaps/y/bo;' failed
01-04 21:16:52.150: W/dalvikvm(19074): Unable to resolve superclass of Lmaps/i/k; (4208)
01-04 21:16:52.150: W/dalvikvm(19074): Link of class 'Lmaps/i/k;' failed
01-04 21:16:52.150: E/dalvikvm(19074): Could not find class 'maps.i.k', referenced from method maps.z.ag.a
01-04 21:16:52.150: W/dalvikvm(19074): VFY: unable to resolve new-instance 3540 (Lmaps/i/k;) in Lmaps/z/ag;
01-04 21:16:52.150: D/dalvikvm(19074): VFY: replacing opcode 0x22 at 0x006d
01-04 21:16:52.160: D/dalvikvm(19074): VFY: dead code 0x006f-007f in Lmaps/z/ag;.a (Landroid/view/LayoutInflater;Lcom/google/android/gms/maps/GoogleMapOptions;ZLjava/lang/String;)Lmaps/z/ag;

GoogleAPILv.10を使用してエミュレータで実行する場合のlogcat

03-25 13:00:47.974: W/GooglePlayServicesUtil(751): Google Play services is missing.
03-25 13:00:47.992: W/GooglePlayServicesUtil(751): Google Play services is missing.
03-25 13:00:47.992: W/GooglePlayServicesUtil(751): Google Play services is missing.
03-25 13:00:48.002: W/GooglePlayServicesUtil(751): Google Play services is missing.
03-25 13:00:48.002: W/GooglePlayServicesUtil(751): Google Play services is missing.
03-25 13:00:48.022: W/GooglePlayServicesUtil(751): Google Play services is missing.
03-25 13:00:48.072: D/AndroidRuntime(751): Shutting down VM
03-25 13:00:48.072: W/dalvikvm(751): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-25 13:00:48.133: E/AndroidRuntime(751): FATAL EXCEPTION: main
03-25 13:00:48.133: E/AndroidRuntime(751): java.lang.RuntimeException: Unable to start activity ComponentInfo{Activity}: java.lang.NullPointerException
03-25 13:00:48.133: E/AndroidRuntime(751):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
03-25 13:00:48.133: E/AndroidRuntime(751):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
03-25 13:00:48.133: E/AndroidRuntime(751):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
03-25 13:00:48.133: E/AndroidRuntime(751):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
03-25 13:00:48.133: E/AndroidRuntime(751):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-25 13:00:48.133: E/AndroidRuntime(751):  at android.os.Looper.loop(Looper.java:130)
03-25 13:00:48.133: E/AndroidRuntime(751):  at android.app.ActivityThread.main(ActivityThread.java:3683)
03-25 13:00:48.133: E/AndroidRuntime(751):  at java.lang.reflect.Method.invokeNative(Native Method)
03-25 13:00:48.133: E/AndroidRuntime(751):  at java.lang.reflect.Method.invoke(Method.java:507)
03-25 13:00:48.133: E/AndroidRuntime(751):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-25 13:00:48.133: E/AndroidRuntime(751):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-25 13:00:48.133: E/AndroidRuntime(751):  at dalvik.system.NativeStart.main(Native Method)
03-25 13:00:48.133: E/AndroidRuntime(751): Caused by: java.lang.NullPointerException
03-25 13:00:48.133: E/AndroidRuntime(751):  at Activity.onCreate(Activity.java:250)
03-25 13:00:48.133: E/AndroidRuntime(751):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-25 13:00:48.133: E/AndroidRuntime(751):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
03-25 13:00:48.133: E/AndroidRuntime(751):  ... 11 more

Activity.onCreate(Activity.java:250)この行を指しています:

map.setOnMarkerDragListener(markerDragListener);

私が試したこと

そして、この行を追加すると奇妙なことに

<uses-library android:name="com.google.android.maps" />

AndroidManifest.xml、logcatは何も表示せず(エラーなし、警告なし)、マップはまだ空白です。しかし、誰かがこの行が彼女/彼の白地図の問題を解決したと言っている投稿があります:https ://stackoverflow.com/questions/15595357/android-supportmapfragment-google-play-services-issue

私のプロジェクトのAndroid Dependenciesフォルダには、次の*.jarファイルがあります。

actionbar-sherlock-4.2-library.jar
google-play-services_lib.jar
android-support-v4.jar
actionbarsherlock-plugin-maps-4.2.0.jar
google-play-services.jar

この投稿の回答から、Googleマップがエミュレーターでうまく動作しない可能性があることを認識しています。必要なのは、失敗した実際のAndroid2.3デバイスにマップを表示することだけです。

さらに、私はこれらの投稿にも細心の注意を払い、それらの方法を試しました(私の状況に該当する場合)が、それでも私の問題には喜びがありません:

Google MapV2androidマップ参照

APIレベル10でGoogleMapsAPI v2を使用するにはどうすればよいですか?

Google MapFragmentは空白(白)で、クラス'maps.jk'が見つかりませんでした

新しいSupportMapFragmentでのActionBarSherlockの使用

さらに詳しい情報が必要な場合は、下にコメントを残してください。追加しようと思います。

4

5 に答える 5

5

OK、何時間も考えて試した後、この問題を修正済みとしてマークできると思います。

この問題は、2.3デバイスの日付と時刻が間違っていることが原因で発生します。

2.3デバイスの日時は、長時間電源が切れたために2013/01/01にリセットされます(ログ出力で確認できるように、日付として01/04が表示されます)。また、同じコードで実行すると、Google Maps V2は2.3デバイスでは表示されませんでしたが、4.0以降のデバイスでは表示されます(使用している4.0以降のデバイスの時刻が正しいため)。

このデバイスとGoogleマップサーバーの間の日付と時刻の大きな違いのために、それらの間の通信が誤動作したと思います(正確な理由はわかりませんが、タイムスタンプのものである必要があります)。

2.3デバイスの日付と時刻を手動で現在の時刻に設定すると、問題はすぐに解決しました。

この問題は非常に奇妙で、ログアウトは次のように表示されます。

メソッドmaps.z.ag.aから参照されているクラス'maps.ik'が見つかりませんでした

あいまいなため、デバイスの日付と時刻が間違っていることが原因で問題が発生しているとは考えにくいです。

したがって、次回Google Maps APIで遊んでいるときに何か問題が発生した場合は、次の手順に従って確認してください。

  • デバイスの日付と時刻の設定が現在のタイムゾーンに対応しているかどうかを確認します(残念ながら、ログ出力では、日付と時刻について考えるための建設的な情報はあまり返されません)
  • APIコンソールで正しいサービスを有効にしたかどうかを確認します(有効にしGoogle Maps API Android V2ないでください。この手順で何か問題が発生した場合はGoogle Maps API V2ログが返されます)Authentication Failed
  • 正しいキーストアを使用してAPIシークレットを取得したかどうかを確認します(ログには、次のようなヒントが表示されます)Authentication Failed
  • 正しいライブラリファイルが含まれているかどうかを確認してください

私を助けようとした人に感謝します。この質問と解決策が他の人に役立つことを願っています。

于 2013-03-26T11:43:39.543 に答える
1

これはで発生する一般的な問題google Map using Api v2です。の主な理由google play serviceは、google play serviceが更新された場合、マップビューのみが表示されることです。デバイスでアプリを実行すると問題を解決できます。デバイスで試してみてください。

于 2013-03-25T13:49:40.380 に答える
1

この関連する質問をチェックしてください:Androidの空白スペースのGoogleマップ

v1からv2に変更すると、新しいAPIキーを取得するのが難しくなり、v2ではキーがマニフェストに保存されるようです。これが機能するかどうか教えてください。

于 2013-03-25T21:00:24.130 に答える
1

わかった。以下のリンクは、私も同じ問題を抱えるのを防いだので、いくらか役立つと思います。APIレベル4.0以降のバージョンでは問題が発生していないため、わかりませんが

google-maps-v2-shows-blank-screen-on-android-2-2

問題が原因である可能性がありますDebug.keystore

解決策: APIキーを取得するためのSHA-1コードを作成したのと同じキーストアを使用してアプリをデバッグしていることを確認してください。

Ubantuを使用していて、Eclipseをルートとして開いているとしましょう。アプリをビルドするときはいつでも、Eclipseはdefault.keystoreを使用して、にあるデバイスでアプリを実行します。root/.android/debug.keystoreそのため、APIキーを作成するときは、使用していることを確認する必要があります。アプリをビルドするのと同じキーストア。

それがあなたを助けることを願っています。

于 2013-03-26T06:17:14.167 に答える
1

両方の権限をAndroidManifest.xmlファイルに追加します。

<permission
 android:name="YOUR_PACKAGE_NAME.permission.MAPS_RECEIVE"
 android:protectionLevel="signature"/>
<uses-permission android:name="YOUR_PACKAGE_NAME.permission.MAPS_RECEIVE"
 android:protectionLevel="signature"/>
于 2013-07-08T06:12:28.977 に答える