0

このhttps://developers.google.com/maps/documentation/android/start#installing_the_google_maps_android_v2_apiに従って、 Google Map API の使用方法を学習しています。

これは私のマニフェストです:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.dude.uniplaces"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true"/>


    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <permission
        android:name="com.dude.uniplaces.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.dude.uniplaces.permission.C2D_MESSAGE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <permission
        android:name="com.dude.uniplaces.permission.MAPS_RECEIVE"
        android:protectionLevel="signature"/>
<uses-permission android:name="com.dude.uniplaces.permission.MAPS_RECEIVE"/>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <uses-library android:name="com.google.android.maps" />          
        <receiver
            android:name="com.google.android.gcm.GCMBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

                <category android:name="com.dude.uniplaces" />
            </intent-filter>
        </receiver>

        <service android:name="com.dude.uniplaces.GCMIntentService" />

        <activity
            android:name="com.dude.uniplaces.Index"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.dude.uniplaces.Dude"
            android:label="dude" >
        </activity>
        <activity
            android:name="com.dude.uniplaces.SendMess"
            android:label="sendmess" >
        </activity>
        <meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="AIzaSyBUO0v3_pHsRXfnGyJ68AeZkCUtHINw6OA"/>

    </application>

</manifest>

これは私の主な活動のxmlファイルです:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".Index" >  


    <Button
     android:layout_height="wrap_content"
     android:layout_width="wrap_content"
     android:text="Invia Messaggio"
     android:onClick="sendMex" />
    <fragment 
          android:id="@+id/map"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:name="com.google.android.gms.maps.MapFragment"/>



</RelativeLayout>

これが私の主な活動です:

package com.dude.uniplaces;
import static com.dude.uniplaces.CommonUtilities.DISPLAY_MESSAGE_ACTION;
import static com.dude.uniplaces.CommonUtilities.EXTRA_MESSAGE;
import static com.dude.uniplaces.CommonUtilities.SENDER_ID;

import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.Toast;

import com.google.android.gcm.GCMRegistrar;


public class Index extends Activity {
    ProgressDialog progressBar;
    AsyncTask<Void, Void, Void> mRegisterTask;
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.index);
        // Phone is ready
        GCMRegistrar.checkDevice(this);
        // Checking Manifest
        GCMRegistrar.checkManifest(this);
        registerReceiver(mHandleMessageReceiver, new IntentFilter(DISPLAY_MESSAGE_ACTION));
        // Ottieni il Registration ID
        final String regId = GCMRegistrar.getRegistrationId(this);
        // Controllo se sono registrato
        if (regId.equals("")) {
            // Mi registro
            GCMRegistrar.register(this, SENDER_ID);
        } else {
            // Sono registrato
            if (!GCMRegistrar.isRegisteredOnServer(this)) {
                // Provo a registrarmi ancora

                final Context context = this;
                mRegisterTask = new AsyncTask<Void, Void, Void>() {
                    @Override
                    protected Void doInBackground(Void... params) {
                        ServerUtilities.register(context, regId);
                        return null;
                    }
                    @Override
                    protected void onPostExecute(Void result) {
                        mRegisterTask = null;
                    }
                };
                mRegisterTask.execute(null, null, null);
            }
        }
        /* Here I should be registred */
        /* Now is time to take gps coordinates */
        LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
        boolean enabled = service.isProviderEnabled(LocationManager.GPS_PROVIDER);

        // Check if enabled and if not send user to the GSP settings
        // Better solution would be to display a dialog and suggesting to 
        // go to the settings

        if (!enabled) {
          Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
          startActivity(intent);
        } 


        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Map<String, String> params = new HashMap<String, String>();
        Criteria criteria = new Criteria();
        String provider = locationManager.getBestProvider(criteria, false);
        Location location = locationManager.getLastKnownLocation(provider);
        String message="x";
        String Id = GCMRegistrar.getRegistrationId(this);
        if( location != null)
             message = String.format("%1$s \n%2$s \n%3$s",Id,
                                        location.getLongitude(), location.getLatitude()
                                );
        if(location == null )
            params.put("one", "BONAA");
        else
        params.put("one", message);
        ServerUtilities su = new ServerUtilities();
        su.go("http://unipiapp.altervista.org/cord.php",params);




    }
    /**
     * Ricevo notifica push
     * */
    private final BroadcastReceiver mHandleMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String newMessage = intent.getExtras().getString(EXTRA_MESSAGE);
            // Sveglia il telefono se è in stand-by
            WakeLocker.acquire(getApplicationContext());
            // Visualizza il messaggio
            Toast.makeText(getApplicationContext(), "New Message: " + newMessage, Toast.LENGTH_LONG).show();
            // Rilascia il wavelocker
            WakeLocker.release();
        }
    };
    @Override
    protected void onDestroy() {
        if (mRegisterTask != null) {
            mRegisterTask.cancel(true);
        }
        try {
            unregisterReceiver(mHandleMessageReceiver);
            GCMRegistrar.onDestroy(this);
        } catch (Exception e) {
        }
        super.onDestroy();
    }

/* Function call clickin on button */
public void sendMex(View w)
{
    Intent intent = new Intent(Index.this, SendMess.class);
    startActivity(intent);

}

} /* END CLASS */

Google Play サービスをダウンロードしてワークスペースに追加しましたが、電話でアプリケーションを起動しようとするとクラッシュします:

05-04 20:11:24.441: E/AndroidRuntime(11190): 致命的な例外: メイン 05-04 20:11:24.441: E/AndroidRuntime(11190): java.lang.RuntimeException: アクティビティ ComponentInfo{com を開始できません。 dude.uniplaces/com.dude.uniplaces.Index}: android.view.InflateException: Binary XML file line #19: Error inflating class fragment


編集:あなたが私を見たようにindex.xmlを変更し、正しい方法でGoogleライブラリを追加しました(考えてください)が、それでもクラッシュします!


解決:

import android.support.v4.app.FragmentActivity; の追加を解決しました。チャンスは FragmentActivity でアクティビティを拡張します

4

3 に答える 3

0

google-play-servicesライブラリの参照方法に何らかの問題があるようです。私が書いたこのブログ投稿の最初の 3 つのステップを見て、Google Maps API V2正しく行う方法を理解してください。

Google マップ API V2

于 2013-05-05T07:31:22.723 に答える
0

プロジェクトを右クリックし、[Android Tools] -> [Add Support Library ...] を選択します。

これを変更します

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

これに

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

Google Play サービスが正しく含まれていることを確認するために、プロジェクトを右クリックして [プロパティ] を選択します。左のタブで Android を選択します。右側のペインの下部に、ラベル ライブラリを含むフレームが表示されます。Google Play が正しく追加されると、緑色のチェック マークが表示されます。また、Google Play プロジェクトがワークスペースで開いていることを確認してください。

于 2013-05-05T07:26:02.460 に答える
0

8 での最小 SDK

注 : API 11 以下でアプリを実行する場合は、サポート ライブラリも追加する必要があります。

http://developer.android.com/tools/extras/support-library.html

これを使って

  android:name="com.google.android.gms.maps.SupportMapFragment"

また、以下のリンクのすべての手順に従っていることを確認してください

https://developers.google.com/maps/documentation/android/start

編集

https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/MapFragment

API 12 以降の MapFragment サポート API 11 以前のフラグメント

また、プロジェクト参照を Google Play サービス ライブラリ プロジェクトにマップしていることを確認してください。

マップ プロジェクトで Google Play サービスを参照する

ライブラリプロジェクトかどうかを確認するには。プロジェクトを右クリックしてプロパティに移動します。アンドロイドを選択。Is Library がチェックされているかどうかを確認します。

ここに画像の説明を入力

マップ プロジェクトでライブラリ プロジェクトを参照するには。

プロジェクトを右クリックしてプロパティに移動します。アンドロイドを選択。[追加] をクリックし、ライブラリ プロジェクトを参照して [追加] をクリックし、[OK] をクリックします。下の緑色のチェックマークに注目してください。

ここに画像の説明を入力

詳細については、以下のリンクを確認してください

https://developer.android.com/tools/projects/projects-eclipse.html .

SupportFragment を使用しているため、サポート ライブラリも追加する必要があります。以下のリンクを確認してください

https://developer.android.com/tools/extras/support-library.html

于 2013-05-04T18:21:55.590 に答える