0

私のアプリケーションでは、edittext に入力した住所に基づいて場所をマップにピン留めしたり、onMapReady 関数に表示されるピンを移動したりできるアクティビティがあります。


私のアクティビティのレイアウトには、地図を表示するフラグメント、前のアクティビティのピンの位置に関する情報を返すボタン、住所を入力してボタンを押すと、地図上にあった前のピンが削除され、入力した場所で新しいものが表示されます (存在する場合)。


-- これはonMapReady、検索ボタンにリスナーがあり、ピンを初期化する関数と、ドラッグ後にピンの位置を取得する関数です。

 @Override
    public void onMapReady(final GoogleMap map) {
        map.setMyLocationEnabled(true);
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(position, 13));
        CameraUpdate zoom = CameraUpdateFactory.zoomTo(15);
        map.animateCamera(zoom);

        map.addMarker(new MarkerOptions()
                .title("Shop")
                .snippet("Is this the right location?")
                .position(position))
                .setDraggable(true);

        // map.setInfoWindowAdapter(new PopupAdapter(getLayoutInflater()));
        map.setOnInfoWindowClickListener(this);
        map.setOnMarkerDragListener(this);

        ImageButton search = (ImageButton) findViewById(R.id.search);

        final EditText searchaddress = (EditText) findViewById(R.id.locationsearch);

        final int[] numAttempts = {0};

        search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //FIND LOCATION BY ADDRESS
                Geocoder geoCoder = new Geocoder(MapsActivity.this.getApplicationContext(), Locale.getDefault());
//                try {
                if (searchaddress.getText().toString() != null && !searchaddress.getText().toString().isEmpty()) {
                    try {
                        List<Address> geoResults = geoCoder.getFromLocationName(searchaddress.getText().toString(), 1);

                        if (geoResults != null) {

                          //  do {
                          //      geoResults = geoCoder.getFromLocationName(searchaddress.getText().toString(), 1);

                            //    numAttempts[0] = numAttempts[0] + 1;
                         //   }
                         //   while (geoResults.size() == 0 || numAttempts[0] == 5);

                            if (geoResults.size() > 0) {
                                Address addr = geoResults.get(0);

                                if (!addr.toString().isEmpty()) {
                                    double latitude = addr.getLatitude();
                                    double longitude = addr.getLongitude();

                                    position = new LatLng(latitude, longitude);

                                    map.moveCamera(CameraUpdateFactory.newLatLngZoom(position, 13));
                                    CameraUpdate zoom = CameraUpdateFactory.zoomTo(15);
                                    map.animateCamera(zoom);

                                    //Marker marker = null;
                                    map.clear();
                                    //marker.setPosition(position);
                                    map.addMarker(new MarkerOptions()
                                            .title("Shop")
                                            .snippet("Is this the right location?")
                                            .position(position))
                                            .setDraggable(true);

                                    // map.setInfoWindowAdapter(new PopupAdapter(getLayoutInflater()));
                                    map.setOnInfoWindowClickListener(MapsActivity.this);
                                    map.setOnMarkerDragListener(MapsActivity.this);
                                } else {
                                    Toast.makeText(getApplicationContext(), "Addr is empty!", Toast.LENGTH_LONG).show();
                                }
                            } else {
                                Toast.makeText(getApplicationContext(), "Wrong address. Please try another one! :" + geoResults.size() + "!", Toast.LENGTH_LONG).show();
                            }
                        }
                        else {
                            Toast.makeText(getApplicationContext(), "Null address!", Toast.LENGTH_LONG).show();
                        }
                    }catch(Exception e) {
                        Log.e("GEOCODER", e.getMessage(), e);
                    }
    } else {
                        Toast.makeText(getApplicationContext(), "Please enter an address!", Toast.LENGTH_LONG).show();
                    }
                }
            });
        }

        @Override
        public void onInfoWindowClick(Marker marker) {
            //Toast.makeText(this, marker.getTitle(), Toast.LENGTH_LONG).show();
        }

        @Override
        public void onMarkerDragStart(Marker marker) {
            LatLng position0 = marker.getPosition();

            Log.d(getClass().getSimpleName(), String.format("Drag from %f:%f",
                    position0.latitude,
                    position0.longitude));
        }

        @Override
        public void onMarkerDrag(Marker marker) {
            LatLng position0 = marker.getPosition();

            Log.d(getClass().getSimpleName(),
                    String.format("Dragging to %f:%f", position0.latitude,
                            position0.longitude));

        }

        @Override
        public void onMarkerDragEnd(Marker marker) {
            position = marker.getPosition();

            Log.d(getClass().getSimpleName(), String.format("Dragged to %f:%f",
                    position.latitude,
                    position.longitude));
        }

数日前まで、ユーザーが上記のコードを正確に編集テキストに入力した場所からピンを表示できました。現在、理由は不明ですが、まったく同じコードでこれを行うことはできません。

常にtoast「間違った住所」について表示されます。別のものを試してください!編集テキストに入力したアドレスが存在する場合でも、そのサイズgeoResultsは常に 0 であり、Logcat で例外は発生しません



-- do-while 部分をコメントから削除すると、logcat の例外は次のようになります。

02-24 13:13:53.251  28017-28024/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ Jit: resizing JitTable from 4096 to 8192
02-24 13:14:57.465  28017-28020/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ threadid=3: reacting to signal 3
02-24 13:14:57.765  28017-28020/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt'
02-24 13:15:02.701  28017-28017/guide_me_for_all.guide_me_for_all A/libc﹕ Fatal signal 6 (SIGABRT) at 0x000008d2 (code=0), thread 28017 (uide_me_for_all)
02-24 13:15:06.605  28881-28881/guide_me_for_all.guide_me_for_all D/ActivityThread﹕ handleBindApplication:guide_me_for_all.guide_me_for_all
02-24 13:15:06.605  28881-28881/guide_me_for_all.guide_me_for_all D/ActivityThread﹕ setTargetHeapUtilization:0.75
02-24 13:15:06.605  28881-28881/guide_me_for_all.guide_me_for_all D/ActivityThread﹕ setTargetHeapMinFree:524288
02-24 13:15:07.296  28881-28881/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ Could not find method android.view.ViewGroup.onNestedScrollAccepted, referenced from method android.support.v7.internal.widget.ActionBarOverlayLayout.onNestedScrollAccepted
02-24 13:15:07.296  28881-28881/guide_me_for_all.guide_me_for_all W/dalvikvm﹕ VFY: unable to resolve virtual method 11956: Landroid/view/ViewGroup;.onNestedScrollAccepted (Landroid/view/View;Landroid/view/View;I)V
02-24 13:15:07.296  28881-28881/guide_me_for_all.guide_me_for_all D/dalvikvm﹕ VFY: replacing opcode 0x6f at 0x0000
02-24 13:15:07.296  28881-28881/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ Could not find method android.view.ViewGroup.onStopNestedScroll, referenced from method android.support.v7.internal.widget.ActionBarOverlayLayout.onStopNestedScroll
02-24 13:15:07.296  28881-28881/guide_me_for_all.guide_me_for_all W/dalvikvm﹕ VFY: unable to resolve virtual method 11962: Landroid/view/ViewGroup;.onStopNestedScroll (Landroid/view/View;)V
02-24 13:15:07.296  28881-28881/guide_me_for_all.guide_me_for_all D/dalvikvm﹕ VFY: replacing opcode 0x6f at 0x0000
02-24 13:15:07.306  28881-28881/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ Could not find method android.support.v7.internal.widget.ActionBarOverlayLayout.stopNestedScroll, referenced from method android.support.v7.internal.widget.ActionBarOverlayLayout.setHideOnContentScrollEnabled
02-24 13:15:07.306  28881-28881/guide_me_for_all.guide_me_for_all W/dalvikvm﹕ VFY: unable to resolve virtual method 9598: Landroid/support/v7/internal/widget/ActionBarOverlayLayout;.stopNestedScroll ()V
02-24 13:15:07.306  28881-28881/guide_me_for_all.guide_me_for_all D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x000e
02-24 13:15:07.316  28881-28881/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations
02-24 13:15:07.316  28881-28881/guide_me_for_all.guide_me_for_all W/dalvikvm﹕ VFY: unable to resolve virtual method 570: Landroid/content/res/TypedArray;.getChangingConfigurations ()I
02-24 13:15:07.316  28881-28881/guide_me_for_all.guide_me_for_all D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
02-24 13:15:07.326  28881-28881/guide_me_for_all.guide_me_for_all I/dalvikvm﹕ Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.internal.widget.TintTypedArray.getType
02-24 13:15:07.326  28881-28881/guide_me_for_all.guide_me_for_all W/dalvikvm﹕ VFY: unable to resolve virtual method 592: Landroid/content/res/TypedArray;.getType (I)I
02-24 13:15:07.326  28881-28881/guide_me_for_all.guide_me_for_all D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
02-24 13:15:07.536  28881-28881/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 13:15:07.546  28881-28881/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 13:15:07.556  28881-28881/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 13:15:08.147  28881-28881/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 13:15:08.147  28881-28881/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 13:15:08.147  28881-28881/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 13:15:08.157  28881-28881/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 13:15:08.167  28881-28881/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 13:15:08.167  28881-28881/guide_me_for_all.guide_me_for_all E/Spinner﹕ setPopupBackgroundDrawable: incompatible spinner mode; ignoring...
02-24 13:15:08.577  28881-28881/guide_me_for_all.guide_me_for_all D/libEGL﹕ loaded /system/lib/egl/libEGL_mali.so
02-24 13:15:08.587  28881-28881/guide_me_for_all.guide_me_for_all D/libEGL﹕ loaded /system/lib/egl/libGLESv1_CM_mali.so
02-24 13:15:08.597  28881-28881/guide_me_for_all.guide_me_for_all D/libEGL﹕ loaded /system/lib/egl/libGLESv2_mali.so
02-24 13:15:08.627  28881-28881/guide_me_for_all.guide_me_for_all D/OpenGLRenderer﹕ Enabling debug mode 0
02-24 13:15:08.647  28881-28881/guide_me_for_all.guide_me_for_all I/Choreographer﹕ Skipped 59 frames!  The application may be doing too much work on its main thread.
02-24 13:15:09.598  28881-28881/guide_me_for_all.guide_me_for_all I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@41f5b4e8 time:26642276

この行で:

12386-12386/guide_me_for_all.guide_me_for_all A/libc﹕ 致命的なシグナル 6 (SIGABRT) 0x000008d2 (コード=0)、スレッド 12386 (uide_me_for_all) 、

括弧内が何なのかわかりませんが、私のパッケージ名はuide_me_for_all ではなくg uide_me_for_all です。(これと関係がある場合)


誰かが上記のすべての意味を見つけるのを手伝ってくれたら、本当に感謝しています.


上記のコードを修正した後の更新: クラスから前のアクティビティに位置を返すコード (未解決 - 常に NULL 値を取得):

クラスで:

@Override
    protected void onPostExecute(LatLng result) {
        Log.i("GEOCODE", result.toString());

        Intent i = new Intent(this.mainContxt , MapsActivity.class );
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        i.putExtra( "latlng" , result );

        this.mainContxt.startActivity(i);

        super.onPostExecute(result);
    }

MapsActivity の onCreate には、次のようなものがあります。

 if (getIntent() != null) {
                Intent intent = getIntent();null){
                    position_from_address = intent.getStringExtra("latlng");
}

その後、アクティビティの検索ボタンの onClickListener で、次のような位置を取得しています。

if (position_from_address != null){
                        String[] latlong = position_from_address.split(",");
                        double latitude = Double.parseDouble(latlong[0]);
                        double longitude = Double.parseDouble(latlong[1]);

                        position = new LatLng(latitude, longitude);
4

1 に答える 1

1

問題は、ルックアップがバックグラウンド スレッドで行われていない可能性があります。ここで私の回答からコードをコピーして貼り付けてみてください: Google Geocoder service is unavaliable (Coordinates to address)

次に、 new GetAddressPositionTask().execute("someAddress") を実行して、何が起こるかを確認します。

AsyncTask にコンテキストを渡す:

コンストラクターを追加します。

public class GetAddressPositionTask extends
    AsyncTask<String, Integer, LatLng> {

     private Context context;

     public GetAddressPositionTask(Context context) {
         this.context = context;
     }

     // .. rest of the code here

}

使用法:

GetAddressPositionTask(context).execute("someAddress")

またはフラグメントから呼び出された場合はどこcontextにありますかgetApplicationContext()getActivity().getApplicationContext()

nullpointer について:

nullpointer を取得している場所が 100% 明確ではありませんが、次のようにできるはずです。

// in onPostExecute    
i.putParcelable("latlng", result);

そしてMapsActivity

LatLng position = (getIntent() != null) ? getParcelable("latlng") : null;

もうひとつの気になるところはthis.mainContxtYourActivity.this代わりにまたはを実行するだけですgetApplicationContext()。Fragment にいる場合Context context = getActivity()は、null でないことを確認してください。

于 2015-02-24T15:37:50.960 に答える