1

この問題に関する多くの投稿を見てきましたが、解決策を提供してくれるものはありませんでした。

GPS (または、最終的には他の有効なプロバイダー) を介してユーザーの位置を取得しようとしています。しかし、私は常にnullの場所を取得しています。私は地図を取得し、任意の場所を設定できますが、機能しないプロバイダーです。

MAPS キーを適切に設定し(正しいキーであることも確認しました)、必要なすべてのアクセス許可を設定しました ( android.permission.INTERNETandroid.permission.ACCESS_COARSE_LOCATIONandroid.permission.ACCESS_FINE_LOCATION)。

このコードで可能なすべてのプロバイダーを取得しようとしました:

List<String> providers = locManager.getAllProviders();
for (String provider : providers) {
    printProvider(provider);
}

これは、すべてのプロバイダー (私の場合は 4 つ) が DummyLocationProviders であることを示しています。

エミュレーターではなく、電話でアプリを実行しようとしています(ただし、GPS を有効にしたエミュレーターでも試してみましたが、役に立ちませんでした)。

これは、場所を取得するために使用しているコードです (昨日も問題なく動作しました)。

//Get criteria
        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);

        //Get best provider
        String  bestProvider = locManager.getBestProvider(criteria, false);
        printProvider(bestProvider);



        //get the current location (last known location) from the location manager
        Location location = locManager.getLastKnownLocation(bestProvider);

        //if location found display as a toast the current latitude and longitude
        if (location != null) {
            Toast.makeText(this, "Current location:\nLatitude: " + location.getLatitude() + "\n" + "Longitude: " + location.getLongitude(), Toast.LENGTH_LONG).show();

            point = new GeoPoint((int) (location.getLatitude()*1E6),(int)(location.getLongitude() *1E6));
            controller.animateTo(point);
        } else {
            Toast.makeText(this, "Cannot fetch current location!", Toast.LENGTH_LONG).show();
        }

私のマニフェストファイル:

 <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="10" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".activities.MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

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

        <activity
            android:name=".activities.GoogleMapsActivity"
            android:label="@string/title_activity_maps" >
        </activity>

        <activity
            android:name=".activities.MyMapsActivity"
            android:label="@string/title_activity_maps" >
        </activity>
</application>
</manifest>
4

2 に答える 2

1

このコードを試してください:

  import java.io.IOException;
  import java.util.List;
  import java.util.Locale;

  import android.content.Context;
  import android.graphics.Canvas;
  import android.location.Address;
  import android.location.Geocoder;
  import android.location.Location;
  import android.location.LocationListener;
  import android.location.LocationManager;
  import android.os.Bundle;
  import android.widget.Toast;

  import com.google.android.maps.GeoPoint;
  import com.google.android.maps.MapActivity;
  import com.google.android.maps.MapController;
  import com.google.android.maps.MapView;
  import com.google.android.maps.Overlay;

  public class MyMapsActivity extends MapActivity 
   {    

        MapView mapView;
        MapController mapController;
        LocationManager locationManager;
        LocationListener locationListener;
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
             {
               super.onCreate(savedInstanceState);
               setContentView(R.layout.main);

                mapView = (MapView) findViewById(R.id.mapView);
                // enable Street view by default
                mapView.setStreetView(true);

                // enable to show Satellite view
               // mapView.setSatellite(true);

              // enable to show Traffic on map
               // mapView.setTraffic(true);

                mapView.setBuiltInZoomControls(true);

                mapController = mapView.getController();
                mapController.setZoom(5); 


      locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
      locationListener = new GPSLocationListener();
      locationManager.requestLocationUpdates(
      LocationManager.GPS_PROVIDER, 0, 0, locationListener);
      Touchy t = new Touchy();
      List<Overlay> overlayList = mapView.getOverlays();
      overlayList.add(t);
      }
     @Override
      protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
          return false;
       }


      class Touchy extends Overlay
      {
        public boolean onTap(GeoPoint point, MapView mapView) 
           {
            Context contexto = mapView.getContext();
            String msg = "Latitude : " + point.getLatitudeE6()/1E6 + " - " + "Longitude : " + point.getLongitudeE6()/1E6;

             Toast toast = Toast.makeText(contexto, msg, Toast.LENGTH_SHORT);
             toast.show();

            return true;
          }
       }


      private class GPSLocationListener implements LocationListener 
         {
          public void onLocationChanged(Location location)
            {
             if (location != null)
              {
               GeoPoint point = new GeoPoint((int) (location.getLatitude() * 1E6),(int) (location.getLongitude() * 1E6));

               Toast.makeText(getBaseContext(),"Latitude: " + location.getLatitude() + " Longitude: " + location.getLongitude(), 
               Toast.LENGTH_SHORT).show();

         mapController.animateTo(point);
         mapController.setZoom(5);
         mapView.invalidate();
       }

          if (location != null)
             {
               GeoPoint point=null;
               String address = ConvertPointToLocation(point);
               Toast.makeText(getBaseContext(), address, Toast.LENGTH_SHORT).show();

             }
         }

        public String ConvertPointToLocation(GeoPoint point) {   
               String address = "";
               Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());
               try {
                     List<Address> addresses = geoCoder.getFromLocation(point.getLatitudeE6()  / 1E6, 
                     point.getLongitudeE6() / 1E6, 1);

           if (addresses.size() > 0) {
                  for (int index = 0; 
                    index < addresses.get(0).getMaxAddressLineIndex(); index++)
                    address += addresses.get(0).getAddressLine(index) + " ";
                }
            }
        catch (IOException e) {        
                    e.printStackTrace();
             }   

     return address;
    }

}

レイアウトコーディング:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 
          xmlns:android="http://schemas.android.com/apk/res/android" 
          android:layout_width="fill_parent" 
          android:layout_height="fill_parent">

     <com.google.android.maps.MapView 
              android:id="@+id/mapView"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:enabled="true"
              android:clickable="true"
              android:apiKey="Your MAP API Key"/>

     <LinearLayout android:id="@+id/zoom" 
             android:layout_width="wrap_content" 
             android:layout_height="wrap_content" 
             android:layout_alignParentBottom="true" 
             android:layout_centerHorizontal="true" />

     </RelativeLayout>

独自の API キー プロセスを取得するためのリンク:

http://sanathnandasiri.blogspot.in/2011/04/obtaining-google-maps-api-key-for.html

于 2012-10-15T11:14:11.773 に答える
0

//ロケーションマネージャから現在のロケーション(最後に認識されたロケーション)を取得しますLocation location = locManager.getLastKnownLocation(bestProvider);

上記の行の代わりにこれを使用してください

          location = locManager.getLastKnownLocation(bestProvider);
        locManager.requestLocationUpdates(bestProvider,0, 0, locationListener);
        location = locManager.getLastKnownLocation(bestProvider);
        locManager.requestLocationUpdates(bestProvider,0, 0, locationListener);

初回の場所はnullなので、現在の場所を最後の場所に設定します。

于 2012-10-15T11:03:08.167 に答える