[JAVA] Programmieren ab 51 Jahren Machen Sie FusedLocationProviderClient in ForegroundService ansässig

Machen Sie FusedLocationProviderClient in Foreground Serivice resident

Ich beziehe mich auf androidDeveloper und googleApi. Ich verweise auch auf die Website von nyan </ font>. Vielen Dank.
Der folgende Beispielcode zeigt, dass die Build-Version von Android api26 oder höher ist.

Bestätigung des Manifest Gradle

Manifest


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

builed.gradle


dependencies {
    ...
    implementation 'com.google.android.gms:play-services-location:17.0.0'

** Synchronisieren Sie danach unbedingt gradle! ** </ font>

Absturzcode ohne Benachrichtigung

Durch die Benachrichtigung wird der Code länger, daher ist es zunächst ein Code, um den Vorgang einfach zu überprüfen. Beim Start werden Standortinformationen erfasst, und die Erfassung von Diensten und Standortinformationen wird durch Drücken einer Taste verworfen. Absturz nach 5 Sekunden

MainActivity


public class MainActivity extends AppCompatActivity {

    static MainActivity activity;
    static TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        activity = MainActivity.this;
        textView = findViewById(R.id.textView);
        Button button = findViewById(R.id.button);

        final Intent intent = new Intent(this,MyService.class);
        startForegroundService(intent);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stopService(intent);
            }
        });
    }
}

MyService


public class MyService extends Service {

    MainActivity activity;
    TextView textView;
    FusedLocationProviderClient fusedLocationClient;
    LocationCallback myCallback;

    @Override
    public void onCreate() {
        super.onCreate();
        activity = MainActivity.activity;
        textView = MainActivity.textView;
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(activity);
    }

    @Override
    public int onStartCommand(Intent intent,int flags,int startId){
        //Wenn true, setzen Sie hier Notification und startForeground
        //Aber es wird schwer zu sehen sein, also werde ich es diesmal weglassen
        myCallback = new myCallback(); // LocationCallback()Beispiel
        myCheckPermission();           // ActivityCompat.checkSelfPermission()
        myGetLocation();               // FusedLocationProviderClient.requestLocationUpdates(); 
        return START_STICKY;
    }

    //Permisson ACCESS im Manifest festgelegt_FINE_LAGE
    //Da es sich um einen gefährlichen Benutzer handelt, ist eine Erlaubnis zur Erlaubnis erforderlich!
    public void myCheckPermission(){
        if(ActivityCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},100);
            // requestPermissions()Der Inhalt bestätigt in
            //Wenn true, onRequestPermissionsResult()Es wird mit verarbeitet, aber weggelassen
        }else{
            return;
        }
    }

    public void myGetLocation(){
        //Legen Sie das Verhalten von fusedLocationProviderClient fest
        LocationRequest locationRequest = LocationRequest.create();
            locationRequest.setInterval(1000*3);
            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        //Dann! Standortinformationen abrufen! Die erfassten Informationen sind Rückruf()Mit einer Funktion umgehen!
        fusedLocationClient.requestLocationUpdates(locationRequest,myCallback,null);
    }

    //Wenn Sie in MainActivity die Stopp-Taste drücken, wird der Dienst zerstört.
    //Zu diesem Zeitpunkt wird onDestroy aufgerufen
    // onDestroy()Ich werde den usedLocationProviderClient zerstören!
    @Override
    public void onDestroy() {
        super.onDestroy();
        fusedLocationClient.removeLocationUpdates(myCallback);
    }

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

    // LocationCallback()ist.
    //Es ist diese Klasse, die die erfassten Standortinformationen verarbeitet!
    class myCallback extends LocationCallback{
          @Override
          public void onLocationResult(LocationResult locationResult){
              super.onLocationResult(locationResult);
              //In locationResult sind Standortinformationen enthalten. Verwenden wir sie also!
              double latitude = locationResult.getLastLocation().getLatitude();
              String strLatitude = String.valueOf(latitude);
              textView.setText(strLatitude);
        }
    }
}

Code, um es ansässig zu machen und den Breiten-, Längen- und Höhenbereich zu ermitteln

Klicken Sie auf die Schaltfläche Start, um Standortinformationen zu erfassen und resident anzuzeigen. Verwenden Sie die Schaltfläche Stopp, um die Erfassung von Dienst- und Standortinformationen abzubrechen. Lass uns gehen!

MainActivity


public class MainActivity extends AppCompatActivity {

    //Machen Sie UI-Teile, auf die in Service verwiesen wird, statisch
    static MainActivity activity;
    static TextView textAlutitude;
    static TextView textLatitude;
    static TextView textLongitude;

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

        //Holen Sie sich das Objekt!
        activity = MainActivity.this;
        textAlutitude = findViewById(R.id.textAltitude);
        textLatitude = findViewById(R.id.textLatitude);
        textLongitude = findViewById(R.id.textLongitude);
        Button btnStart= findViewById(R.id.btnStart);
        Button btnStop = findViewById(R.id.btnStop);


        //Starten Sie den Foraground-Dienst mit der Schaltfläche Start
        //Stoppen Sie den Vordergrunddienst mit der Stopp-Taste
        //Vordergrunddienst Beenden Sie meinen Dienst.onDestroy()Zerstört auch FusedLocationProviderClient
        final Intent intent = new Intent(activity,MyService.class);
        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startForegroundService(intent);
            }
        });

        btnStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stopService(intent);
            }
        });

    }
}

MyService


public class MyService extends Service {

    //Objekte global machen
    MainActivity activity;
    TextView textAltitude;
    TextView textLatitude;
    TextView textLongitude;
    FusedLocationProviderClient fusedLocationClient;
    LocationRequest locationRequest;
    LocationCallback locationCallback;

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

        //Holen Sie sich das Objekt!
        activity = MainActivity.activity;
        textAltitude = MainActivity.textAlutitude;
        textLatitude = MainActivity.textLatitude;
        textLongitude = MainActivity.textLongitude;
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);

        //Beim Einstellen der Standortanforderung
        //Stellen Sie ein, dass alle 5 Sekunden detaillierte Standortinformationen abgerufen werden
        locationRequest = LocationRequest.create();
            locationRequest.setInterval(1000*5);
            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }

    public int onStartCommand(Intent intent, int flags, int startId){
        //

        //
        Notification notification;
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this,"id");
        Intent pIntent = new Intent(this,MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this,0,pIntent,0);
        notification = builder.setSmallIcon(R.drawable.notification_icon)
                              .setContentTitle("NotificationTitle")
                              .setContentText("NotificationText")
                              .setContentIntent(pendingIntent)
                              .build();
        int importance = NotificationManager.IMPORTANCE_LOW;
        NotificationChannel channel = new NotificationChannel("id","name",importance);
        NotificationManager manager = getSystemService(NotificationManager.class);
        manager.createNotificationChannel(channel);

        //!!
        startForeground(1,notification);


        // LocationCallback(),Update,
        locationCallback = new LocationCallback(){
            @Override
            public void onLocationResult(LocationResult locationResult){
                super.onLocationResult(locationResult);
                String alti = String.valueOf(locationResult.getLastLocation().getAltitude());
                String lati = String.valueOf(locationResult.getLastLocation().getLatitude());
                String longi = String.valueOf(locationResult.getLastLocation().getLongitude());
                textAltitude.setText(alti);
                textLatitude.setText(lati);
                textLongitude.setText(longi);
            }
        };

        checkLocationPermission();
        return START_STICKY;
    }

    //Stellen Sie den Benachrichtigungsinhalt, die Wichtigkeit und den Start des Kanals innerhalb von 5 Sekunden ein. Beeilen Sie sich! Wird in requestLocationremove verwendet. Rufen Sie daher die hier erstellten Standortinformationen ab.
    private void locationUpdate(){
        fusedLocationClient.requestLocationUpdates(locationRequest,locationCallback,null);
    }

    // permission ACCESS_FINE_LOCATION ist eine benutzergefährdende Einstellung. Überprüfen Sie daher Ihre Berechtigungen
    public void checkLocationPermission(){
        if(ActivityCompat.checkSelfPermission(activity,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            // ACCESS_FINE_Bestätigen Sie mit dem Benutzer im Dialogfeld ohne LOCATION-Berechtigung
            ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},100);
        }else{
            locationUpdate();
        }
    }

    // checkLocationPermission()Verarbeiten Sie den dem Benutzer bestätigten Inhalt mit requestPermissions von
    public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults){
        if(requestCode == 100){
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
                //Sobald die Erlaubnis erhalten wurde
                locationUpdate();
            }else{
                //Wenn Sie keine Erlaubnis bekommen
                textAltitude.setText("No permission");
            }
        }
    }

    //FusedLocationProviderClient wird auch zerstört, wenn der Dienst zerstört wird
    @Override
    public void onDestroy() {
        super.onDestroy();
        fusedLocationClient.removeLocationUpdates(locationCallback);
    }

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

Auch diesmal habe ich viel Zeit verbracht. Für mich war es eine zu hohe Hürde, Standortinformationen zu erhalten. Es dauert ungefähr 2 Wochen, um diesen Code zu erstellen. Es war endlich möglich, nachdem man hin und her wiederholt hatte.

Diesmal ist auch die Geschichte der Schildkröte.

Ich hatte das Gefühl, dass ich mich vorwärts bewegen könnte, wenn ich weiter mit dem Weg der Schildkröte kämpfen würde und ohne aufzugeben. Selbst wenn Sie denken, dass es unmöglich ist, können Sie vorwärts gehen. Mir fehlen immer noch die Fähigkeiten, aber es ist interessant. sehr lustig!

Recommended Posts