2016-11-09 1 views
0

Ich bin in echten Schwierigkeiten hier. Ich versuche, alle 3 Sek. Mit einem Hintergrunddienst zu arbeiten, aber ich kann nur einige Daten schreiben, wenn ich in erweiterten Steuerelementen des Emulators auf Send lat und Lon klicke, so dass sowohl Telefon als auch Emulator nicht funktionieren. Hier ist mein Code unten, es wäre toll, wenn mir jemand helfen könnte. Vielen Dank!Nicht Lage mit Service (LocationManager)

Dienst

public class GPSService extends Service { 


    private static final String TAG = "GpsService"; 
    private LocationListener locationListener; 
    private LocationManager locationManager; 


    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 

     locationListener = new LocationListener() { 
      @Override 
      public void onLocationChanged(Location location) { 
       Intent i = new Intent("location_update"); 
       i.putExtra("latExtra",location.getLatitude()); 
       i.putExtra("lonExtra",location.getLongitude()); 
       sendBroadcast(i); 
       Log.i(TAG, "onLocationChanged: extras lat lon"+location.getLatitude()+" "+location.getLongitude()); 
      } 

      @Override 
      public void onStatusChanged(String s, int i, Bundle bundle) { 

      } 

      @Override 
      public void onProviderEnabled(String s) { 

      } 

      @Override 
      public void onProviderDisabled(String s) { 
       Log.i(TAG, "onProviderDisabled: DISABLED"); 
       Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       startActivity(i); 
      } 
     }; 

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

     Criteria c = new Criteria(); 
     String provider =locationManager.getBestProvider(c,true); 
     Log.i(TAG, "onCreate: bestProvider "+provider); 

     //noinspection MissingPermission 
     locationManager.requestLocationUpdates(provider,2000,0,locationListener); 

    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 

     if (locationManager != null){ 
      Log.i(TAG, "onDestroy: Location manager nije null i brisem"); 
      //noinspection MissingPermission 
      locationManager.removeUpdates(locationListener); 
     } 

    } 
} 

MainActivity

private final String TAG = "Main"; 
    ... 
    BroadcastReceiver broadcastReciever; 




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


     if(!runtimePermisions()){ 
      startLocationUpdate();} 
... 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //stopService(); 
       if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
        //REQUEST PERMISSION 
        Log.i(TAG, "onClick: NO PERMISION"); 
       } else { 
        Log.i(TAG, "onClick: got permision"); 
       } 
... 
    } 
    public void startLocationUpdate(){ 
     Intent i = new Intent(this,GPSService.class); 
     startService(i); 
     Log.i(TAG, "startLocationUpdate: Pokrenuo sam service"); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     if (broadcastReciever == null){ 
      broadcastReciever = new BroadcastReceiver() { 
       @Override 
       public void onReceive(Context context, Intent intent) { 

        lat = (Double) intent.getExtras().get("latExtra"); 
        lon = (Double) intent.getExtras().get("lonExtra"); 

        Log.i(TAG, "onReceive: lat lon "+lat+" "+lon); 
       } 
      }; 
     } 
     registerReceiver(broadcastReciever,new IntentFilter("location_update")); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     if (broadcastReciever!=null){ 
      unregisterReceiver(broadcastReciever); 
     } 
    } 

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

     if (requestCode == 100) { 
       if (grantResults [0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED){ 
        startLocationUpdate(); 
       }else{ 
        runtimePermisions();} 
      } 

    } 


    private boolean runtimePermisions() { 
     if (Build.VERSION.SDK_INT >= 23 &&ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED && 
       ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED){ 
      requestPermissions(new String[]{ 
        Manifest.permission.ACCESS_COARSE_LOCATION, 
        Manifest.permission.ACCESS_FINE_LOCATION, 

      },100); 
      return true; 
     } 
     return false; 
    } 

MANIFESTEN

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

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

    <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> 
     <activity android:name=".SettingsActivity" 
      android:theme="@style/SettingsTheme"></activity> 
     <service android:name=".Gps.GPSService"/> 
    </application> 

</manifest> 

wieder ... Jede Hilfe wäre toll! DANK: D

+0

Für mich müssen ein paar Sekunden warten, bevor Telefon den Standort erhalten. –

Antwort

0

Wie K. Sopheak sagte, kann es eine Weile dauern, um den Standort zu bekommen. Aus der Dokumentation:

Es kann eine Weile dauern, bis die erste Standortaktualisierung empfangen wird. Wenn ein unmittelbarer Speicherort erforderlich ist, können Anwendungen die getLastKnownLocation (String) -Methode verwenden.

Also, Sie könnten versuchen, die letzte bekannte Position bekommen getLastKnownLocation(String) zu verwenden, wenn der Dienst gestartet und wird, es besteht unter der Annahme, übertragen es auf die gleiche Weise würden Sie eine Standortaktualisierung. Bedenken Sie jedoch, dass der letzte bekannte Standort veraltet sein könnte. Je nachdem, was Sie verwenden, ist der Standort möglicherweise nicht akzeptabel.

Auch als beiseite, ein paar Gedanken:

  1. sagte Sie 3 Sekunden, aber der Code verwendet 2,000 Millisekunden - wurde, dass nur ein Tippfehler?

  2. Die Häufigkeit der Standortaktualisierungen ist Minimum Zeit - Sie sind nicht garantiert, Updates oft zu erhalten. Gemäß der Dokumentation:

    Das Standortaktualisierungsintervall kann mit dem Parameter minTime gesteuert werden. Die verstrichene Zeit zwischen Standortaktualisierungen wird nie kleiner als minTime sein, obwohl dies mehr von der Implementierung des Standortproviders und dem von anderen Anwendungen angeforderten Aktualisierungsintervall abhängen kann.

  3. Gibt es einen besonderen Grund, warum Sie Standortaktualisierungen mit einer so hohen Frequenz benötigen? Die Beschaffung eines Standorts kann sehr kostenintensiv sein, insbesondere, wenn Sie sowohl FINE- als auch COARSE-Standorterlaubnisse anfordern. Wenn Sie dies so häufig anfordern, kann dies die Akkulaufzeit des Geräts erheblich beeinträchtigen. Dies ist insbesondere der Fall, wenn der Code in einem Dienst ausgeführt wird und daher auch dann ausgeführt wird, wenn sich die Anwendung im Hintergrund befindet oder der Benutzer sich in einer Aktivität befindet, für die keine Standortdaten erforderlich sind. Erneut aus der Dokumentation:

    Die Auswahl eines vernünftigen Werts für minTime ist wichtig, um die Akkulaufzeit zu erhalten. Jedes Standort-Update benötigt Strom von GPS, WIFI, Cell und anderen Funkgeräten. Wählen Sie einen minTime-Wert so hoch wie möglich aus, und stellen Sie dabei eine angemessene Benutzererfahrung bereit.Wenn Ihre Anwendung nicht im Vordergrund ist und dem Benutzer den Standort anzeigt, sollte Ihre Anwendung die Verwendung eines aktiven Anbieters vermeiden (z. B. NETWORK_PROVIDER oder GPS_PROVIDER). Wenn Sie jedoch darauf bestehen, wählen Sie minTime 5 * 60 * 1000 (5 Minuten) oder größer. Wenn sich Ihre Anwendung im Vordergrund befindet und dem Benutzer den Speicherort anzeigt, sollten Sie ein schnelleres Aktualisierungsintervall auswählen.

  4. Google empfiehlt die Verwendung von Google Play services location APIs anstelle der Android Framework Standort-APIs:

    Die Google Play-Dienste sind von Standort-APIs über den Android Framework Standort-APIs (android.location) als eine Möglichkeit der Zugabe bevorzugt Standorterkennung für Ihre App Wenn Sie derzeit die Android Framework-Standort-APIs verwenden, sollten Sie so schnell wie möglich zu den Standort-APIs für Google Play-Dienste wechseln.

+0

Vielen Dank für die Antwort, yep es war nur ich Typo ich änderte es auf 2sec, um es zu überprüfen. Meine Frage ist, sollte nicht LocationChanged einige Daten feuern, auch wenn es null ist? Im Grunde muss ich nur einen einzigen Ort bekommen, damit ich meine Wetterdaten abrufen kann und das ist, und auf Refresh-Taste, um den Standort erneut zu überprüfen. Mir sind einfach die Optionen ausgegangen, weil alles, was ich versuche, nicht funktioniert und ich habe in den letzten 6 Tagen große Probleme damit. Ich weiß nichts über Google Play-Dienste, da der Nutzer sie manchmal nicht aktiviert hat. Hast du einfache Lösungen für mein Problem? Danke nochmal – vibetribe93

Verwandte Themen