2016-08-22 69 views
1

我編碼檢測我在android棉花糖中的當前位置,但我得到null位置。請告訴任何解決方案以解決此問題.Google地圖正在我的手機中工作爲什麼它返回null。在Android中使用gps提供商時位置管理器返回空位置Marshmallow

MainActivity.class

if (isGPSEnabled) { 
    if (location == null) { 
     mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); 

     if (mLocationManager != null) { 
      // mLocationManager.removeUpdates(locationListener); 
      location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
      Log.i("location","location-->"+location); 
      tv_new.setText("Location:" +String.valueOf(location)); 

      if (location != null) { 

       latitude = location.getLatitude(); 
       longitude = location.getLongitude(); 
       tv_lat.setText("Latitude:" + String.valueOf(latitude)); 
       tv_lon.setText("Longitude:" +String.valueOf(longitude)); 
       String filterAddress = ""; 

       try { 
        Log.i("TAG", "geoCoder" + geoCoder); 
        List<Address> addresses = geoCoder.getFromLocation(latitude, longitude, 1); 
         Log.i("TAG", "addresses" + addresses.size()+latitude+longitude); 
         for (int i = 0; i < addresses.get(0) 
           .getMaxAddressLineIndex(); i++) { 
          filterAddress += addresses.get(0).getAddressLine(i) 
            + " "; 
          Log.i("TAG", "filterAddress" + filterAddress); 
          tv_address.setText("Address"+ filterAddress); 
         } 

       } 
       catch (IOException ex) { 
        Log.i("TAG", "filterAddress catch 1st"+ ex+ filterAddress); 
        ex.printStackTrace(); 

       } catch (Exception e2) { 
        Log.i("TAG", "filterAddress catch 2nd"+e2+"--->"+geoCoder); 

        // TODO: handle exception 
        e2.printStackTrace(); 
       } 
      } 
     } 
    } 
} 

輸出

Location:null in ASUS_ZOOLD Phone 
+1

危險的權限(如位置)有在運行時從棉花糖開始獲得。看看[this](https://developer.android.com/training/permissions/requesting.html),並確保你的流程符合它。 –

+0

Aneeb有一點,現在需要詢問運行時間的權限,更容易和準確的位置獲取使用此回購,我希望它可以幫助https://github.com/meetmehdi/GetAccurateLocation –

+0

可能重複的[位置管理器返回空指針期望](http://stackoverflow.com/questions/23971333/location-manager-returns-null-pointer-expection) – TR4Android

回答

0

添加該代碼,要求准予

`

private void checkForPermisson { 
    if (ActivityCompat.checkSelfPermission(this, 
      Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && 
      ActivityCompat.checkSelfPermission(this, 
        Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 202); 
     } 
     return; 
    } else { 
     //add your if block here 
    } 


} 


    @Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {  
     switch (requestCode) { 
      case 202: 
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       //add your if block here 
      } else { 
       Log.e(TAG, "else RequestPermission"); 
      } 
       break; 
      default: 
       return; 
     }  
} 

`

1

嘗試這樣的..

public class Splash extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener, ResultCallback<LocationSettingsResult> { 

    /** Define all global variables over here */ 
    Context context; 
    private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; 

    // All GPS based work goes over here .. 
    protected static final String TAG = "UserNavigation"; 
    protected static final int REQUEST_CHECK_SETTINGS = 0x1; 
    public static final long UPDATE_INTERVAL_IN_MILLISECONDS = 1000; 
    public static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = UPDATE_INTERVAL_IN_MILLISECONDS/2; 
    protected GoogleApiClient mGoogleApiClient; 
    protected LocationRequest mLocationRequest; 
    protected LocationSettingsRequest mLocationSettingsRequest; 
    protected Location mCurrentLocation; 
    protected Boolean mRequestingLocationUpdates = false; 
    protected String mLastUpdateTime; 
    private static final int PERMISSION_ACCESS_COARSE_LOCATION = 1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_splash); 

     context = Splash.this; 
     SharedPrefUtil.setSharedPref(context, "alert", false); 
     new TestAsync().execute(); 

     initui(); 

     PulsatorLayout pulsator = (PulsatorLayout) findViewById(R.id.pulsator); 
     pulsator.start(); 

     if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
     { 
      if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) 
       ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CALL_PHONE}, PERMISSION_ACCESS_COARSE_LOCATION); 
      else 
       checkLocationSettings(); 
     } 
     else 
      checkLocationSettings(); 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     switch (requestCode) { 
      case PERMISSION_ACCESS_COARSE_LOCATION: 

       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) 
        checkLocationSettings(); 
       else 
        finish(); 

       break; 
     } 
    } 

    private void initui() { 
     initiateSplashWork(); 
    } 

    private void initiateSplashWork() { 
     if (checkPlayServices()) { 
      initiateGPS(); 
     } 
    } 

    private void initiateGPS() 
    { 
     buildGoogleApiClient(); 
     createLocationRequest(); 
     buildLocationSettingsRequest(); 
    } 

    private boolean checkPlayServices() { 
     GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); 
     int resultCode = apiAvailability.isGooglePlayServicesAvailable(this); 
     if (resultCode != ConnectionResult.SUCCESS) { 
      if (apiAvailability.isUserResolvableError(resultCode)) { 
       apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST) 
         .show(); 
      } else { 
       Toast.makeText(context, R.string.toast_device_not_support, Toast.LENGTH_SHORT).show(); 
       finish(); 
      } 
      return false; 
     } 
     return true; 
    } 

    /** All GPS based method callback */ 
    @Override 
    public void onConnected(Bundle bundle) { 

     Thread logoTimer = new Thread() { 
      public void run() { 
       try { 
        int logoTimer = 0; 
        while (logoTimer < 5000) { 
         sleep(100); 
         logoTimer = logoTimer + 100; 
        } 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 
     logoTimer.start(); 

     if (mCurrentLocation == null) 
     { 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
      { 
       if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
       { 
        mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
        mLastUpdateTime = DateFormat.getTimeInstance().format(new Date()); 

        return; 
       } 
       else 
       { 
        mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
        mLastUpdateTime = DateFormat.getTimeInstance().format(new Date()); 
       } 
      } 
      else 
      { 
       mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
       mLastUpdateTime = DateFormat.getTimeInstance().format(new Date()); 
      } 
     } 
    } 

    private void initiateNext() 
    { 
     Thread logoTimer = new Thread() { 
      public void run() 
      { 
       try 
       { 
        int logoTimer = 0; 
        while (logoTimer < 5000) { 
         sleep(100); 
         logoTimer = logoTimer + 100; 
        } 
        Intent intent = new Intent(context, OneClassBuilt.class); 
        startActivity(intent); 
       } 
       catch (InterruptedException e) 
       { 
        e.printStackTrace(); 
       } 
       finally 
       { 
        finish(); 
       } 
      } 
     }; 
     logoTimer.start(); 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     mCurrentLocation = location; 
     mLastUpdateTime = DateFormat.getTimeInstance().format(new Date()); 
     Toast.makeText(context, "onLocationChanged method : " + location.getLatitude() + " ____ " + location.getLongitude(), Toast.LENGTH_SHORT).show(); 
     SharedPrefUtil.setSharedPref(context, "lat", String.valueOf(location.getLatitude())); 
     SharedPrefUtil.setSharedPref(context, "lon", String.valueOf(location.getLongitude())); 
    } 

    protected synchronized void buildGoogleApiClient() { 
     Log.i(TAG, "Building GoogleApiClient"); 
     mGoogleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this).addOnConnectionFailedListener(this).addApi(LocationServices.API).build(); 
    } 

    protected void createLocationRequest() { 
     mLocationRequest = new LocationRequest(); 
     mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS); 
     mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    } 

    protected void buildLocationSettingsRequest() { 
     LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder(); 
     builder.addLocationRequest(mLocationRequest); 
     builder.setAlwaysShow(true); 
     mLocationSettingsRequest = builder.build(); 
    } 

    protected void checkLocationSettings() { 
     PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, mLocationSettingsRequest); 
     result.setResultCallback(this); 
    } 

    @Override 
    public void onResult(LocationSettingsResult locationSettingsResult) { 
     final Status status = locationSettingsResult.getStatus(); 

     switch (status.getStatusCode()) { 
      case LocationSettingsStatusCodes.SUCCESS: 
       Log.i(TAG, "All location settings are satisfied."); 
       startLocationUpdates(); 
       initiateNext(); 
       break; 
      case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
       Log.i(TAG, "Location settings are not satisfied. Show the user a dialog to" + "upgrade location settings "); 

       try { 
        status.startResolutionForResult(Splash.this, REQUEST_CHECK_SETTINGS); 
       } catch (IntentSender.SendIntentException e) { 
        Log.i(TAG, "PendingIntent unable to execute request."); 
       } 
       break; 
      case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
       finish(); 
       Log.i(TAG, "Location settings are inadequate, and cannot be fixed here. Dialog " + "not created."); 
       break; 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (requestCode) { 
      case REQUEST_CHECK_SETTINGS: 
       switch (resultCode) { 
        case Activity.RESULT_OK: 
         Log.i(TAG, "User agreed to make required location settings changes."); 
         startLocationUpdates(); 
         initiateNext(); 
         break; 
        case Activity.RESULT_CANCELED: 
         Log.i(TAG, "User chose not to make required location settings changes."); 
         finish(); 
         break; 
       } 
       break; 
     } 
    } 

    protected void startLocationUpdates() { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
       return; 
      } 
     } 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this).setResultCallback(new ResultCallback<Status>() { 
      @Override 
      public void onResult(Status status) { 
       mRequestingLocationUpdates = true; 
      } 
     }); 
    } 

    protected void stopLocationUpdates() { 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this).setResultCallback(new ResultCallback<Status>() { 
      @Override 
      public void onResult(Status status) { 
       mRequestingLocationUpdates = false; 
      } 
     }); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     if (mGoogleApiClient != null) 
      mGoogleApiClient.connect(); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     if (mGoogleApiClient != null && mGoogleApiClient.isConnected() && mRequestingLocationUpdates) 
      startLocationUpdates(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) 
      stopLocationUpdates(); 
    } 

    @Override 
    protected void onStop() { 
     if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) { 
      mGoogleApiClient.disconnect(); 
     } 
     super.onStop(); 
    } 
} // End of main class over here .. 

在清單:

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

,向全球依賴應用gradle這個文件中添加..

compile 'com.google.android.gms:play-services:8.4.0' 
compile 'com.google.android.gms:play-services-location:8.1.0' 
相關問題