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