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.
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>
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);
}
}
}
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