3

ここにMainActivityクラスがあります

java.io.BufferedReader をインポートします。
import java.io.IOException;
java.io.InputStream をインポートします。
java.io.InputStreamReader をインポートします。
java.net.HttpURLConnection をインポートします。
java.net.URL をインポートします。
import java.util.ArrayList;
java.util.HashMap をインポートします。
java.util.List をインポートします。

org.json.JSONObject をインポートします。

android.graphics.Color をインポートします。
android.os.AsyncTask をインポートします。
android.os.Bundle をインポートします。
android.support.v4.app.FragmentActivity をインポートします。
android.util.Log をインポートします。
android.view.Menu をインポートします。
android.view.View をインポートします。
android.view.View.OnClickListener をインポートします。
android.widget.Button をインポートします。

com.google.android.gms.maps.GoogleMap をインポートします。
インポート com.google.android.gms.maps.GoogleMap.OnMapClickListener;
インポート com.google.android.gms.maps.GoogleMap.OnMapLongClickListener;
com.google.android.gms.maps.SupportMapFragment をインポートします。
com.google.android.gms.maps.model.BitmapDescriptorFactory をインポートします。
com.google.android.gms.maps.model.LatLng をインポートします。
com.google.android.gms.maps.model.MarkerOptions をインポートします。
com.google.android.gms.maps.model.PolylineOptions をインポートします。


public class MainActivity extends FragmentActivity {

    GoogleMap マップ;
    ArrayList マーカーポイント;

    @オーバーライド
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初期化中
        マーカーポイント = 新しい ArrayList();

        // activity_main の SupportMapFragment への参照を取得
        SupportMapFragment fm = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);

        // Button への参照を取得する
        ボタン btnDraw = (ボタン)findViewById(R.id.btn_draw);       

        // SupportMapFragment のマップを取得する
        マップ = fm.getMap();

        // マップで MyLocation ボタンを有効にする
        map.setMyLocationEnabled(true);     

        // マップの onclick イベント リスナーを設定する
        map.setOnMapClickListener(新しいOnMapClickListener() {

            @オーバーライド
            public void onMapClick(LatLng ポイント) {

                // すでに 10 の場所があり、8 つのウェイポイントと 1 つの開始場所と 1 つの終了場所があります。
                // 非ビジネス ユーザーのクエリでは最大 8 つのウェイポイントが許可されます
                if(markerPoints.size()>=10){
                    戻る;
                }

                // 新しい項目を ArrayList に追加
                markerPoints.add(ポイント);                

                // MarkerOptions の作成
                MarkerOptions options = new MarkerOptions();

                // マーカーの位置を設定
                options.position(ポイント);

                /**
                 ※スタート地点はマーカーの色がGREENで、
                 * 終了位置の場合、マーカーの色は赤で、
                 * その他のマーカーは、色は AZURE です
                 */
                if(markerPoints.size()==1){
                    options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
                }else if(markerPoints.size()==2){
                    options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));
                }そうしないと{
                    options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));
                }           

                // 新しいマーカーを Google マップ Android API V2 に追加します
                map.addMarker(オプション);         

            }
        });


        // 長いクリックでマップがクリアされます
        map.setOnMapLongClickListener(新しいOnMapLongClickListener() {

            @オーバーライド
            public void onMapLongClick(LatLng ポイント) {
                // Google マップからすべてのポイントを削除します
                map.clear();

                // ArrayList 内のすべてのポイントを削除します
                マーカーポイント.clear();

            }
        });


        // ボタン btn_draw のクリック イベント ハンドラ
        btnDraw.setOnClickListener(新しいOnClickListener() {

            @オーバーライド
            public void onClick(View v) {
                // 開始位置と終了位置がキャプチャされているかどうかを確認します
                if(markerPoints.size() >= 2){                   
                    LatLng 原点 = markerPoints.get(0);
                    LatLng dest = markerPoints.get(1);

                    // Google Directions API への URL を取得する
                    文字列 url = getDirectionsUrl(origin, dest);                

                    DownloadTask downloadTask = new DownloadTask();

                    // Google Directions API から json データのダウンロードを開始します
                    downloadTask.execute(url);
                }

            }
        });     


    }

    private String getDirectionsUrl(LatLng origin,LatLng dest){

        // ルートの起点
        文字列 str_origin = "origin="+origin.latitude+","+origin.longitude;

        // ルートの行き先
        文字列 str_dest = "destination="+dest.latitude+","+dest.longitude;      

        // センサー有効
        文字列センサー = "センサー = false";         

        // ウェイポイント
        文字列ウェイポイント = "";
        for(int i=2;i{         

        // 非 UI スレッドでのデータのダウンロード
        @オーバーライド
        保護された文字列 doInBackground(文字列... url) {

            // Web サービスからのデータを格納するため
            文字列データ = "";

            試す{
                // Web サービスからデータを取得する
                データ = downloadUrl (url[0]);
            }キャッチ(例外e){
                Log.d("バックグラウンド タスク",e.toString());
            }
            データを返します。        
        }

        // の実行後、UI スレッドで実行されます
        // doInBackground()
        @オーバーライド
        protected void onPostExecute(文字列の結果) {           
            super.onPostExecute(結果);            

            ParserTask parserTask = new ParserTask();

            // JSON データを解析するためのスレッドを呼び出します
            parserTask.execute(結果);

        }       
    }

    /** Google プレイスを JSON 形式で解析するクラス */
    プライベート クラス ParserTask は AsyncTask を拡張します>> >{

        // 非 UI スレッドでのデータの解析        
        @オーバーライド
        保護されたリスト>> doInBackground(文字列... jsonData) {

            JSONObject jObject;
            リスト >> ルート = null;                     

            試す{
                jObject = 新しい JSONObject(jsonData[0]);
                DirectionsJSONParser パーサー = 新しい DirectionsJSONParser();

                // データの解析を開始します
                ルート = parser.parse(jObject);    
            }キャッチ(例外e){
                e.printStackTrace();
            }
            帰りのルート;
        }

        // 解析プロセスの後、UI スレッドで実行されます
        @オーバーライド
        protected void onPostExecute(List>> 結果) {

            ArrayList ポイント = null;
            PolylineOptions lineOptions = null;

            // すべてのルートをたどる
            for(int i=0;i();
                lineOptions = new PolylineOptions();

                // i 番目のルートを取得
                リスト> パス = 結果.get(i);

                // i 番目のルートのすべてのポイントを取得
                for(int j=0;j ポイント = path.get(j);                 

                    double lat = Double.parseDouble(point.get("lat"));
                    double lng = Double.parseDouble(point.get("lng"));
                    LatLng position = new LatLng(lat, lng);

                    points.add(位置);                       
                }

                // ルート内のすべてのポイントを LineOptions に追加します
                lineOptions.addAll(ポイント);
                lineOptions.width(2);
                lineOptions.color(Color.RED);               
            }

            // Google マップに i 番目のルートのポリラインを描画
            map.addPolyline(lineOptions);                           
        }           
    }   


    @オーバーライド
    public boolean onCreateOptionsMenu(メニュー メニュー) {
        // メニューを膨らませます。これにより、アイテムが存在する場合はアクション バーにアイテムが追加されます。
        getMenuInflater().inflate(R.menu.main, メニュー);
        true を返します。
    }   
}

方向パーサークラスはこんな感じ

パッケージ in.wptrafficanalyzer.locationwaypointmapv2;

import java.util.ArrayList;
java.util.HashMap をインポートします。
java.util.List をインポートします。

org.json.JSONArray をインポートします。
org.json.JSONException をインポートします。
org.json.JSONObject をインポートします。

com.google.android.gms.maps.model.LatLng をインポートします。

public class DirectionsJSONParser {

    /** JSONObject を受け取り、緯度と経度を含むリストのリストを返します */
    公開リスト>> parse(JSONObject jObject){

        List>> routes = new ArrayList>>();
        JSONArray jRoutes = null;
        JSONArray jLegs = null;
        JSONArray jSteps = null;    

        試す {

            jRoutes = jObject.getJSONArray("ルート");

            /** すべてのルートをたどる */
            for(int i=0;i>();

                /** すべての足をトラバース */
                for(int j=0;j list = decodePoly(ポリライン);

                        /** すべてのポイントをトラバース */
                        for(int l=0;l hm = new HashMap();
                            hm.put("lat", Double.toString(((LatLng)list.get(l)).latitude) );
                            hm.put("lng", Double.toString(((LatLng)list.get(l)).longitude) );
                            path.add(hm);                       
                        }                               
                    }
                    routes.add(パス);
                }
            }

        } キャッチ (JSONException e) {         
            e.printStackTrace();
        }キャッチ(例外e){           
        }


        帰りのルート;
    }   


    /**
     * ポリライン ポイントをデコードする方法
     * 礼儀: jeffreysambells.com/2010/05/27/decoding-polylines-from-google-maps-direction-api-with-java
     * */
    非公開リストのdecodePoly(エンコードされた文字列) {

        リスト poly = new ArrayList();
        int インデックス = 0、len = エンコードされた.length();
        int lat = 0、lng = 0;

        ながら (インデックス = 0x20);
            int dlat = ((結果 & 1) != 0 ? ~(結果 >> 1) : (結果 >> 1));
            lat += dlat;

            シフト = 0;
            結果 = 0;
            行う {
                b = エンコードされた.charAt(index++) - 63;
                結果 |= (b & 0x1f) = 0x20);
            int dlng = ((結果 & 1) != 0 ? ~(結果 >> 1) : (結果 >> 1));
            lng += dlng;

            LatLng p = new LatLng((((double) lat / 1E5)),
                    (((double) lng / 1E5)));
            poly.add(p);
        }

        ポリゴンを返します。
    }
}

Android Manifest.xml は

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

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

 <permission
      android:name="in.wptrafficanalyzer.locationwaypointmapv2.permission.MAPS_RECEIVE"
      android:protectionLevel="signature" />

<uses-permission android:name="in.wptrafficanalyzer.locationwaypointmapv2.permission.MAPS_RECEIVE" />

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

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true"/>


<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="in.wptrafficanalyzer.locationwaypointmapv2.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="AIzaSyC6TVk6gtR_i_.......**************"/>    

</application>

そして、レイアウトの activity_main.xml は

<Button 
    android:id="@+id/btn_draw"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/str_btn_draw" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" />


<fragment 
    android:id="@+id/map"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"        
    class="com.google.android.gms.maps.SupportMapFragment" 
    android:layout_above="@id/btn_draw" />

私のLogCatファイルは

03-02 21:35:25.157: D/dalvikvm(25733): CheckJNI の遅延有効化
03-02 21:35:25.758: D/AndroidRuntime(25733): VM をシャットダウンしています
03-02 21:35:25.758: W/dalvikvm(25733): threadid=1: キャッチされない例外で終了するスレッド (group=0x40ddd2a0)
03-02 21:35:25.768: E/AndroidRuntime(25733): 致命的な例外: メイン
03-02 21:35:25.768: E/AndroidRuntime(25733): java.lang.RuntimeException: アクティビティ ComponentInfo を開始できませんXML ファイルの 16 行目: クラス フラグメントの拡張中にエラーが発生しました
03-02 21:35:25.768: E/AndroidRuntime (25733): android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2110) で
03-02 21:35:25.768: E/AndroidRuntime (25733): android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2135) で
03-02 21:35:25.768: E/AndroidRuntime(25733): android.app.ActivityThread.access$700(ActivityThread.java:140) で
03-02 21:35:25.768: E/AndroidRuntime(25733): android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) で
03-02 21:35:25.768: E/AndroidRuntime (25733): android.os.Handler.dispatchMessage (Handler.java:99) で
03-02 21:35:25.768: E/AndroidRuntime(25733): android.os.Looper.loop(Looper.java:137)
03-02 21:35:25.768: E/AndroidRuntime (25733): android.app.ActivityThread.main (ActivityThread.java:4935) で
03-02 21:35:25.768: E/AndroidRuntime(25733): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) で
03-02 21:35:25.768: E/AndroidRuntime(25733): java.lang.reflect.Method.invoke(Method.java:511) で
03-02 21:35:25.768: E/AndroidRuntime(25733): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) で
03-02 21:35:25.768: E/AndroidRuntime (25733): com.android.internal.os.ZygoteInit.main (ZygoteInit.java:805) で
03-02 21:35:25.768: E/AndroidRuntime(25733): dalvik.system.NativeStart.main(ネイティブ メソッド) で
03-02 21:35:25.768: E/AndroidRuntime(25733): 原因: android.view.InflateException: バイナリ XML ファイル行 #16: クラス フラグメントの膨張エラー
03-02 21:35:25.768: E/AndroidRuntime(25733): android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:710) で
03-02 21:35:25.768: E/AndroidRuntime(25733): android.view.LayoutInflater.rInflate(LayoutInflater.java:752) で
03-02 21:35:25.768: E/AndroidRuntime(25733): android.view.LayoutInflater.inflate(LayoutInflater.java:495) で
03-02 21:35:25.768: E/AndroidRuntime(25733): android.view.LayoutInflater.inflate(LayoutInflater.java:397) で
03-02 21:35:25.768: E/AndroidRuntime(25733): android.view.LayoutInflater.inflate(LayoutInflater.java:353) で
03-02 21:35:25.768: E/AndroidRuntime(25733): com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:316) で
03-02 21:35:25.768: E/AndroidRuntime (25733): android.app.Activity.setContentView (Activity.java:1924) で
03-02 21:35:25.768: E/AndroidRuntime (25733): in.wptrafficanalyzer.locationwaypointmapv2.MainActivity.onCreate (MainActivity.java:43) で
03-02 21:35:25.768: E/AndroidRuntime (25733): android.app.Activity.performCreate (Activity.java:5206) で
03-02 21:35:25.768: E/AndroidRuntime (25733): android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1094) で
03-02 21:35:25.768: E/AndroidRuntime (25733): android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2074) で
03-02 21:35:25.768: E/AndroidRuntime(25733): ... 11 詳細
03-02 21:35:25.768: E/AndroidRuntime(25733): 原因: java.lang.IllegalStateException: アプリの AndroidManifest.xml のメタデータ タグに正しい値がありません。4242000 が必要ですが、0 が見つかりました。要素内に次の宣言が必要です。     
03-02 21:35:25.768: E/AndroidRuntime(25733): com.google.android.gms.common.GooglePlayServicesUtil.n (不明なソース) で
03-02 21:35:25.768: E/AndroidRuntime(25733): com.google.android.gms.common.GooglePlayServicesUtil.isGooglePlayServicesAvailable で (不明なソース)
03-02 21:35:25.768: E/AndroidRuntime(25733): com.google.android.gms.maps.internal.qv (不明なソース) で
03-02 21:35:25.768: E/AndroidRuntime(25733): com.google.android.gms.maps.internal.qu (不明なソース) で
03-02 21:35:25.768: E/AndroidRuntime(25733): com.google.android.gms.maps.MapsInitializer.initialize (不明なソース) で
03-02 21:35:25.768: E/AndroidRuntime(25733): com.google.android.gms.maps.SupportMapFragment$b.ex で (不明なソース)
03-02 21:35:25.768: E/AndroidRuntime(25733): com.google.android.gms.maps.SupportMapFragment$ba で (不明なソース)
03-02 21:35:25.768: E/AndroidRuntime(25733): com.google.android.gms.dynamic.aa (不明なソース)
03-02 21:35:25.768: E/AndroidRuntime(25733): com.google.android.gms.dynamic.a.onInflate で (不明なソース)
03-02 21:35:25.768: E/AndroidRuntime(25733): com.google.android.gms.maps.SupportMapFragment.onInflate で (不明なソース)
03-02 21:35:25.768: E/AndroidRuntime(25733): android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:279) で
03-02 21:35:25.768: E/AndroidRuntime(25733): android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:682) で
03-02 21:35:25.768: E/AndroidRuntime(25733): ... 21 詳細

助けてください

4

2 に答える 2