0

GPSを介して現在地を取得するアプリを開発しましたが、nullが返されます。アプリで3gやwifiではなくgpsのみを使用したいのですが、bestproviderを使用しましたが、実行したときにのみ取得し、常に機能するとは限りません。

これはJavaコードです:

    package com.example.loc2;

    import android.location.Location;
 import android.location.LocationListener;
   import android.location.LocationManager;
  import android.os.Bundle;
   import android.app.Activity;
   import android.content.Context;
   import android.view.Menu;
    import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.Button;
   import android.widget.Toast;

   public class MainActivity extends Activity {
private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; // in Meters  
private static final long MINIMUM_TIME_BETWEEN_UPDATES = 1000; // in Milliseconds
protected LocationManager locationManager;
protected Button retrieveLocationButton;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    retrieveLocationButton = (Button) findViewById(R.id.retrieve_location_button);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    locationManager.requestLocationUpdates(
            LocationManager.GPS_PROVIDER, 
            MINIMUM_TIME_BETWEEN_UPDATES, 
            MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,
            new MyLocationListener()
    );

retrieveLocationButton.setOnClickListener(new OnClickListener() {
       // @Override
        public void onClick(View v) {
            showCurrentLocation();
        }
});        

}    

protected void showCurrentLocation() {

    Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

    if (location != null) {
        String message = String.format(
                "Current Location \n Longitude: "+location.getLongitude()+" \n Latitude:"+
                 location.getLatitude());

        Toast.makeText(  MainActivity.this,message,
                Toast.LENGTH_LONG).show();
    }

}   

private class MyLocationListener implements LocationListener {

    public void onLocationChanged(Location location) {
        String message = String.format(
                "New Location \n Longitude: %1$s \n Latitude: %2$s",
                location.getLongitude(), location.getLatitude()
        );
        Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
    }

    public void onStatusChanged(String s, int i, Bundle b) {
        Toast.makeText(MainActivity.this, "Provider status changed",
                Toast.LENGTH_LONG).show();
    }

    public void onProviderDisabled(String s) {
        Toast.makeText(MainActivity.this,
                "Provider disabled by the user. GPS turned off",
                Toast.LENGTH_LONG).show();
    }

    public void onProviderEnabled(String s) {
        Toast.makeText(MainActivity.this,
                "Provider enabled by the user. GPS turned on",
                Toast.LENGTH_LONG).show();
    }

}

}

そしてこれはマニフェストです:私はこの許可を使用しました

  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.loc2"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".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>
    </application>

    </manifest>

助けてください

4

3 に答える 3

0

メソッドを呼び出す適切な順序/順序が必要です。

onCreate() {   
    GoogleApiAvailability mGoogleApiAvailability = GoogleApiAvailability.getInstance();   

    byte b = (byte) mGoogleApiAvailability.isGooglePlayServicesAvailable(this);    


    if (b == ConnectionResult.SUCCESS) {    
        try {   
            MapsInitializer.initialize(getApplicationContext());    

            //setUpMap();    

            if (mGoogleApiClient == null) {    
                mGoogleApiClient = new GoogleApiClient.Builder(this)
                        .addApi(LocationServices.API)
                        .addConnectionCallbacks(this)
                        .addOnConnectionFailedListener(this)
                        .build();   
            }    
        }catch(Exception e) {    
            e.printStackTrace();   
        }   
    }   
}   

@Override   
public void onConnected(@Nullable Bundle bundle) {       
    checkForLocationPermission();      

    Location location1 = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);    

    if(location1 != null) {       
        currentLatitude = location1.getLatitude();    
        currentLongitude = location1.getLongitude();    
    }    

    startLocationUpdtes();    
    setUpMap();    

}    


@Override    
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {    
//super.onRequestPermissionsResult(requestCode, permissions, grantResults);    

    switch(requestCode) {    
        case MY_LAST_KNOWN_LOCATION_PERMISSION:    
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {    

                //Permission was allowed    
                isLocationAccessAllowed = true;    
            } else {    
                //Permission was denied      
            }     
    }     
}    

@Override    
public void onConnectionSuspended(int i) {    

}    

@Override    
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {    

}    

@Override    
public void onLocationChanged(Location location) {    

    currentLatitude = location.getLatitude();    

    currentLongitude = location.getLongitude();    

}     

private void checkForLocationPermission() {    
    boolean isFineLocationNotAllowed = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED;    

    boolean isCoarseLocationNotAllowed = ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED;    

    if(isFineLocationNotAllowed && isCoarseLocationNotAllowed) {    

        //Permission is not granted yet    
        boolean shouldRequestForPermission = ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION);     

        if(shouldRequestForPermission) {    
            //user has allowed permission    

            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.INTERNET, Manifest.permission.ACCESS_COARSE_LOCATION}, MY_LAST_KNOWN_LOCATION_PERMISSION);   

        } else {    
            //user has denied permission    
        }    

    } else {    
        //permission is already granted    

        //ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.INTERNET, Manifest.permission.ACCESS_COARSE_LOCATION}, MY_LAST_KNOWN_LOCATION_PERMISSION);    
    }    
}    
于 2016-11-25T16:22:21.800 に答える
0

ステップ1>GoogleClientAPIインスタンスを準備する
ステップ2>onConnectedコールバックで、andoridランタイム権限メカニズムを使用して実行時にロケーション許可を確認する

ステップ3>getLocation Location location1 = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

ステップ4>LocationRequestをLocationRequestとして準備しますlocationRequest=LocationRequest.create().setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY).setInterval(0).setFastestInterval(0);

setp5>位置情報の更新を次のように登録します

LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient、locationRequest、this);

ステップ6>レイアウトからMapFragmentインスタンスを次のように取得します

SupportMapFragment supportMapFragment =(SupportMapFragment)getSupportFragmentManager()。findFragmentById(R.id.map); supportMapFragment.getMapAsync(this);

于 2016-11-25T16:32:35.397 に答える
-1

これを見てください、それはあなたを助けます

 LocationManager mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    LocationListener mlocListener = new MyLocationListener();
mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
            mlocListener);

public class MyLocationListener implements LocationListener {

    @Override
    public void onLocationChanged(Location loc) {
        loc.getLatitude();
        loc.getLongitude();

        Geocoder gcd = new Geocoder(getApplicationContext(),
                Locale.getDefault());
        try {
            mAddresses = gcd.getFromLocation(loc.getLatitude(),
                    loc.getLongitude(), 1);

        } catch (IOException e) {

        }

        String cityName = (mAddresses != null) ? mAddresses.get(0)
                .getLocality() : TimeZone.getDefault().getID();
        String countryName = (mAddresses != null) ? mAddresses.get(0)
                .getCountryName() : Locale.getDefault().getDisplayCountry()
                .toString();


        mCurrentSpeed.setText("Longitude"+loc.getLongitude()+" Latitude"+loc.getLatitude());
    }

    @Override
    public void onProviderDisabled(String provider) {
        Toast.makeText(getApplicationContext(), "Gps Disabled",
                Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onProviderEnabled(String provider) {
        Toast.makeText(getApplicationContext(), "Gps Enabled",
                Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
}
于 2012-10-14T15:21:24.627 に答える