2016-06-15 6 views
0

Я работаю над проектом, который периодически определяет координаты телефона и загружает их в базу данных. Код я использую:LocationManager не запускается после повторного открытия приложения

public class Activity2 extends AppCompatActivity { 

private LocationManager locm; 
private LocationListener locl; 
private Geocoder geocoder; 
public TextView text, position; 
public double lat, lon; 
public String city; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_2); 
    text = (TextView) findViewById(R.id.textView4); 
    position = (TextView) findViewById(R.id.textView5); 

    text.setText("Seriale: " + Build.SERIAL + "\nNome: " + Build.MANUFACTURER + " " + Build.PRODUCT); 
    geocoder = new Geocoder(getApplicationContext(), Locale.getDefault()); 
    locm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    locl = new LocationListener(){ 
     @Override 
     public void onLocationChanged(Location location) { 
      try{ 
       lat=location.getLatitude(); 
       lon=location.getLongitude(); 
       DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
       String date = df.format(Calendar.getInstance().getTime()); 
       List<Address> la = geocoder.getFromLocation(lat, lon, 1); 
       if (la != null & la.size() > 0) { 
        Address address = la.get(0); 
        city = address.getLocality(); 
       } 
       else 
       { 
        city="UNKNOWN"; 
       } 
       MainActivity.st.executeUpdate("INSERT INTO position VALUES ('" + Build.SERIAL + "', '" + date + "', '" + lat + "', '" + lon + "', '" +city + "')"); 
       position.setText(city); 
      } catch (Exception a){ 

      } 
     } 

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

     } 

     @Override 
     public void onProviderEnabled(String provider) { 

     } 

     @Override 
     public void onProviderDisabled(String provider) { 
      Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
      startActivity(intent); 
     } 

    }; 

    if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M) { 
     if(checkSelfPermission(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{ 
     locm.requestLocationUpdates("gps", 5000, 0, locl); 
    } 
} 

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

     case 10: 
      if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED) { 
       try{ 
        locm.requestLocationUpdates("gps", 5000, 0, locl); 
       }catch (SecurityException e){ 

       } 
      } 
    } 
} 

С чистого старта (без кэш/данные о приложении сохраненным ранее) он работает хорошо и работает, как ожидалось:

  • начинается первое действие, которое простой Логин (если usertext = пользователь $$ passtext = текст начинается Activity2)
  • Activity2 просит разрешения (и GPS, если он отключен)
  • Уэйтса для GPS, чтобы открыть свою первую позицию
  • Загрузки позиции каждые 5 секунд

Но если я закрыть приложение (не нажимая кнопку назад, но его очистки от RAM), а затем я пытаюсь открыть его снова, после начала Activity2 он не спрашивает для включения GPS больше, и он больше не показывает позиции, даже если он уже включен. Единственный способ вернуть его на работу - это очистка данных из внутренней памяти.

Как я могу решить эту проблему? Спасибо.

ответ

1

Проблема в том, что Build.VERSION.SDK_INT >= Build.VERSION_CODES.M is true, и вы уже имеете требуемые разрешения, вы не вызываете requestLocationUpdates().

Попробуйте следующее:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
    if (checkSelfPermission(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 { 
     // you are missing this else block 
     locm.requestLocationUpdates("gps", 5000, 0, locl); 
    } 
} else { 
    locm.requestLocationUpdates("gps", 5000, 0, locl); 
} 
+0

О, дорогая! Я полностью пропустил это. Какой быстрый ответ, теперь он отлично работает, большое вам спасибо! – Dadex