[JAVA] Programmation à partir de 51 ans Make FusedLocationProviderClient resident in ForegroundService

Rendre FusedLocationProviderClient résident dans le service de premier plan

Je fais référence à androidDeveloper et googleApi. Je me réfère également au site de nyan </ font>. Merci beaucoup.
L'exemple de code ci-dessous montre que la version de build d'Android est api26 ou supérieure.

Confirmation du grade du manifeste

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'

** Après cela, assurez-vous de synchroniser gradle! ** </ font>

Crash Code sans notification

La notification rend le code plus long, donc tout d'abord, c'est un code pour vérifier simplement l'opération. Au démarrage, il commence à acquérir des informations de localisation, et l'acquisition des informations de service et de localisation est annulée en appuyant sur un bouton. Crash après 5 secondes

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){
        //Si true, définissez Notification ici et démarrezForeground
        //Mais ce sera difficile à voir, alors je vais l'omettre cette fois
        myCallback = new myCallback(); // LocationCallback()exemple
        myCheckPermission();           // ActivityCompat.checkSelfPermission()
        myGetLocation();               // FusedLocationProviderClient.requestLocationUpdates(); 
        return START_STICKY;
    }

    //Permisson ACCESS défini dans le manifeste_FINE_EMPLACEMENT
    //Puisqu'il s'agit d'un utilisateur dangereux, une autorisation est requise!
    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()Le contenu confirmé dans
            //Si vrai, onRequestPermissionsResult()Il est traité avec, mais il est omis
        }else{
            return;
        }
    }

    public void myGetLocation(){
        //Définir le comportement de fusedLocationProviderClient
        LocationRequest locationRequest = LocationRequest.create();
            locationRequest.setInterval(1000*3);
            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        //Puis! Obtenez des informations de localisation! Les informations acquises sont Callback()Manipulez avec une fonction!
        fusedLocationClient.requestLocationUpdates(locationRequest,myCallback,null);
    }

    //Dans MainActivity, si vous appuyez sur le bouton d'arrêt, le service sera détruit.
    //À ce moment-là, onDestroy est appelé
    // onDestroy()Je vais détruire le usedLocationProviderClient!
    @Override
    public void onDestroy() {
        super.onDestroy();
        fusedLocationClient.removeLocationUpdates(myCallback);
    }

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

    // LocationCallback()est.
    //C'est cette classe qui gère les informations de localisation acquises!
    class myCallback extends LocationCallback{
          @Override
          public void onLocationResult(LocationResult locationResult){
              super.onLocationResult(locationResult);
              //Il y a des informations de localisation dans locationResult, alors utilisons-les!
              double latitude = locationResult.getLastLocation().getLatitude();
              String strLatitude = String.valueOf(latitude);
              textView.setText(strLatitude);
        }
    }
}

Code pour le rendre résident et obtenir la latitude, la longitude et l'altitude

Cliquez sur le bouton Démarrer pour effectuer l'acquisition d'informations de localisation et afficher le résident. Utilisez le bouton Stop pour annuler l'acquisition des informations de service et de localisation. Allons-y!

MainActivity


public class MainActivity extends AppCompatActivity {

    //Rendre les parties de l'interface utilisateur référencées à partir du service statiques
    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);

        //Obtenez l'objet!
        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);


        //Démarrer le service Foraground avec le bouton Démarrer
        //Arrêter le service de premier plan avec le bouton Arrêter
        //Service de premier plan Arrêter mon service.onDestroy()Détruit également 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 {

    //Rendre les objets globaux
    MainActivity activity;
    TextView textAltitude;
    TextView textLatitude;
    TextView textLongitude;
    FusedLocationProviderClient fusedLocationClient;
    LocationRequest locationRequest;
    LocationCallback locationCallback;

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

        //Obtenez l'objet!
        activity = MainActivity.activity;
        textAltitude = MainActivity.textAlutitude;
        textLatitude = MainActivity.textLatitude;
        textLongitude = MainActivity.textLongitude;
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);

        //Lors de la définition de la demande de localisation
        //Configuré pour obtenir des informations de localisation détaillées toutes les 5 secondes
        locationRequest = LocationRequest.create();
            locationRequest.setInterval(1000*5);
            locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }

    public int onStartCommand(Intent intent, int flags, int startId){
        //Je veux le rendre résident, donc je vous en informerai

        //Définir le contenu, l'importance et le canal des notifications
        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 dans les 5 secondes!!Dépêchez-vous!
        startForeground(1,notification);


        // LocationCallback()Est requestLocation,Update,Puisqu'il est utilisé dans remove, créez-le ici
        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;
    }

    //Obtenir des informations de localisation
    private void locationUpdate(){
        fusedLocationClient.requestLocationUpdates(locationRequest,locationCallback,null);
    }

    // permission ACCESS_FINE_LOCATION est un paramètre dangereux pour l'utilisateur, alors vérifiez vos autorisations
    public void checkLocationPermission(){
        if(ActivityCompat.checkSelfPermission(activity,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            // ACCESS_FINE_Confirmer avec l'utilisateur dans la boîte de dialogue sans autorisation LOCATION
            ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},100);
        }else{
            locationUpdate();
        }
    }

    // checkLocationPermission()Traiter le contenu confirmé à l'utilisateur avec demande
    public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults){
        if(requestCode == 100){
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
                //Une fois l'autorisation obtenue
                locationUpdate();
            }else{
                //Si vous n'obtenez pas la permission
                textAltitude.setText("No permission");
            }
        }
    }

    //FusedLocationProviderClient est également détruit lorsque le service est détruit
    @Override
    public void onDestroy() {
        super.onDestroy();
        fusedLocationClient.removeLocationUpdates(locationCallback);
    }

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

Cette fois aussi, j'ai passé beaucoup de temps. Obtenir les informations de localisation des résidents était un obstacle trop important pour moi. Il faut environ 2 semaines pour créer ce code. C'était finalement possible après avoir répété dans les deux sens.

Cette fois, c'est aussi l'histoire de la tortue.

Je sentais que je pouvais avancer si je continuais à lutter avec la marche de la tortue et sans abandonner. Même si vous pensez que c'est impossible, vous pouvez avancer. Je manque encore de capacités, mais c'est intéressant. Très drôle!

Recommended Posts