2016-03-03 3 views
1

Я пытаюсь получить местоположение устройства и по какой-то причине местоположение не получает. Может кто-нибудь, пожалуйста, проверьте мой код и дайте мне знать, в чем ошибка в коде. Спасибо.Мое местоположение Приложение не имеет доступа к getLastKnownLocation

MainActivity

public class MainActivity extends AppCompatActivity implements LocationListener { 
    LocationManager locManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     //get a reference to the location services to initialize the location manager object 
     locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 


     // Creating an empty criteria object 
     Criteria criteria = new Criteria(); 

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      return; 
     } 

     // Get name of the provider in this case which would be gps 
     // String provider = locManager.getBestProvider(criteria, false); 

     // if (provider != null && !provider.equals("")) { 
      // Get the location 
      // Location location = locManager.getLastKnownLocation(provider); 


Location location = getLastKnownLocation(); 

     private Location getLastKnownLocation() { 
      LocationManager mLocationManager = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE); 
      List<String> providers = mLocationManager.getProviders(true); 
      Location bestLocation = null; 
      for (String provider : providers) { 
       Location l = mLocationManager.getLastKnownLocation(provider); 
       if (l == null) { 
        continue; 
       } 
       if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) { 
        // Found best last known location: %s", l); 
        bestLocation = l; 
       } 
      } 
      return bestLocation; 
     } 
      //set frequency of location update parameters 
      locManager.requestLocationUpdates(provider, 120000, 10, this); 

      if (location != null) 
       onLocationChanged(location); 
      else { 
       TextView tvLongitude = (TextView) findViewById(R.id.curr_longitude); 
       tvLongitude.setText("Location can't be retrieved"); 
       Toast.makeText(getBaseContext(), "Location can't be retrieved", Toast.LENGTH_SHORT).show(); 
      } 

    /* } else { 
      //create a toast indicating error. 
      Toast.makeText(getBaseContext(), "OOPS something went wrong", Toast.LENGTH_SHORT).show(); 

     }*/ 
} 


    public void onLocationChanged(Location location) { 
     // text view for company caption 
     TextView jackFruit = (TextView) findViewById(R.id.jack_fruit); 
     // Get TextView curr_longitude 
     TextView tvLongitude = (TextView) findViewById(R.id.curr_longitude); 

     // Getting TextView curr_latitude 
     TextView tvLatitude = (TextView) findViewById(R.id.curr_latitude); 

     // setting company caption 
     jackFruit.setText("Jackfruit Systems: My current location"); 

     // Setting Current Longitude in the TextView 
     tvLongitude.setText("Longitude:" + location.getLongitude()); 

     // Setting Current Latitude in the TextView 
     tvLatitude.setText("Latitude:" + location.getLatitude()); 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 

    } 
} 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.jackfruit.driverlocationinfo"> 

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

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

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

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

</manifest> 
+0

Может быть, вам нужно добавить разрешение '<использует-разрешение андроида: имя = "android.permission.ACCESS_COARSE_LOCATION"/ > ' –

+0

Привет, я попробовал это, все еще не работая. По какой-то причине он не обнаруживает поставщика. –

+0

А какая у вас целевая версия? если 23, то вам нужно попросить разрешения во время выполнения. –

ответ

0

Если вы собираете приложение для Android 6.0+, вы должны запросить разрешения во время выполнения.

Существует код, что Android студия предложить для линии Location location = locManager.getLastKnownLocation(provider);

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      return; 
     } 

И это the link к официальной документации.

EDIT Я попытался запустить этот код на своем телефоне. Это не работает :) код из that question помог мне:

public class MainActivity extends AppCompatActivity implements LocationListener { 
LocationManager locManager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    //get a reference to the location services to initialize the location manager object 
    locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 


    // Creating an empty criteria object 
    Criteria criteria = new Criteria(); 

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
    return; 
    } 

    // Get name of the provider in this case which would be gps 
    // String provider = locManager.getBestProvider(criteria, false); 

    // if (provider != null && !provider.equals("")) { 
    // Get the location 
    // Location location = locManager.getLastKnownLocation(provider); 


    Location location = getLastKnownLocation(); 


    //set frequency of location update parameters 
    locManager.requestLocationUpdates(provider, 120000, 10, this); 

    if (location != null) 
    onLocationChanged(location); 
    else { 
    TextView tvLongitude = (TextView) findViewById(R.id.curr_longitude); 
    tvLongitude.setText("Location can't be retrieved"); 
    Toast.makeText(getBaseContext(), "Location can't be retrieved", Toast.LENGTH_SHORT).show(); 
    } 

    /* } else { 
       //create a toast indicating error. 
       Toast.makeText(getBaseContext(), "OOPS something went wrong", Toast.LENGTH_SHORT).show(); 

      }*/ 
} 

private Location getLastKnownLocation() { 
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
    return; 
    } 
    LocationManager mLocationManager = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE); 
    List <String> providers = mLocationManager.getProviders(true); 
    Location bestLocation = null; 
    for (String provider: providers) { 
    Location l = mLocationManager.getLastKnownLocation(provider); 
    if (l == null) { 
    continue; 
    } 
    if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) { 
    // Found best last known location: %s", l); 
    bestLocation = l; 
    } 
    } 
    return bestLocation; 
} 

public void onLocationChanged(Location location) { 
    // text view for company caption 
    TextView jackFruit = (TextView) findViewById(R.id.jack_fruit); 
    // Get TextView curr_longitude 
    TextView tvLongitude = (TextView) findViewById(R.id.curr_longitude); 

    // Getting TextView curr_latitude 
    TextView tvLatitude = (TextView) findViewById(R.id.curr_latitude); 

    // setting company caption 
    jackFruit.setText("Jackfruit Systems: My current location"); 

    // Setting Current Longitude in the TextView 
    tvLongitude.setText("Longitude:" + location.getLongitude()); 

    // Setting Current Latitude in the TextView 
    tvLatitude.setText("Latitude:" + location.getLatitude()); 
} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 

} 

@Override 
public void onProviderEnabled(String provider) { 

} 

@Override 
public void onProviderDisabled(String provider) { 

} 
} 

Для меня предпочтительным поставщиком был «GPS», но retursn null Местоположение.

P.S. Извините за форматирование. Вы можете нажать Ctrl + Alt + L в Android Studio, чтобы отформатировать его правильно.

+0

Хорошо, это было предложено андроид-студией, и я применил ее раньше. При таком разрешении поставщик вообще не обнаруживается. Его даже не возвращает null, когда я отлаживаю. Есть идеи? –

+0

Не могли бы вы обновить свой код?Когда вы проверяете разрешения - перед 'locManager.getBestProvider (критерии, false);' или после? –

+0

Я обновил свой код. Проверить разрешения до Поставщик строк = locManager.getBestProvider (критерии, false); –

1

Я попробовал альтернативный метод для версий SDk 23.

MainActivity

@Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
// calling location service via location manager 
     locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
     //calling location listener to get location coordinates on change of location 
     locationListener = new LocationListener() { 
      @Override 
      public void onLocationChanged(Location location) { 
       altitude = location.getAltitude();//calling altitude 
       longitude = location.getLongitude();//calling longitude 
       latitude = location.getLatitude();//calling latitude 

       longitudeValue = Double.toString(longitude);//converting double longitude to string 
       latitudeValue = Double.toString(latitude);//converting double latitude to string 
       altitudeValue = Double.toString(altitude);//converting double altitude to string 
      } 

      @Override 
      public void onStatusChanged(String provider, int status, Bundle extras) { 

      } 

      @Override 
      public void onProviderEnabled(String provider) { 

      } 

      @Override 
      public void onProviderDisabled(String provider) { 
       //calling settings options in device when location is disabled 
       Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       startActivity(intent); 
      } 
     }; 
     // adding permissions for location service for api level 23 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 

      requestPermissions(new String[]{ 
        Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, 
        Manifest.permission.INTERNET 
      }, 10); 
      return; 
     } else { 
      //after above check start the method: 
      locationConfiguration(); 
     } 
} 

    //another permission check if the first permissions miss any permission lib. packages 
    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     switch (requestCode) { 
      case 10: 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) 
        locationConfiguration(); 
       return; 
     } 
    } 


    //method to call location provider 
    private void locationConfiguration() { 
     provider = locationManager.getProvider(LocationManager.GPS_PROVIDER); 
     location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, locationListener); 
     locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 0, locationListener); 
     provider.supportsAltitude(); 

    } 

 Смежные вопросы

  • Нет связанных вопросов^_^