#java #android #location #broadcastreceiver
Вопрос:
Я пытаюсь создать приложение, которое отслеживает перевозчика и показывает его на карте. Сначала я попытался получить местоположение backgroun, и мне это удалось, но в видео, которые я смотрю, никто не объясняет, как отправлять данные из службы в действие. Кто-нибудь может мне в этом помочь? Вот мой Сервис и основная деятельность. Мне нужно измерить широту и долготу в режиме основной активности.
--My MainActivity-- import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import android.Manifest; import android.app.ActivityManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.net.ConnectivityManager; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.widget.Toast; import com.example.kuryetakipuygulamasi.databinding.ActivityMainBinding; import com.google.android.material.snackbar.Snackbar; public class MainActivity extends AppCompatActivity { ActivityResultLauncherlt;Stringgt; permissionLauncher; ActivityMainBinding binding; static MainActivity instance; public static MainActivity getInstance(){ return instance; } @Override protected void onCreate(Bundle savedInstanceState) { binding = ActivityMainBinding.inflate(getLayoutInflater()); View view = binding.getRoot(); super.onCreate(savedInstanceState); setContentView(view); instance=this; registerLauncher(); startLocationService(); if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){ if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) { Snackbar.make(view,"CAMERAYA ERİŞİM İZNİ GEREKLİ",Snackbar.LENGTH_INDEFINITE).setAction("İZİN VER", new View.OnClickListener() { @Override public void onClick(View view) { //İZİN İSTE permissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION); } }).show(); }else{ //İZİN İSTE permissionLauncher.launch(Manifest.permission.ACCESS_FINE_LOCATION); } }else{ // İZİN VERİLDİ if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION)!= PackageManager.PERMISSION_GRANTED){ if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION)) { Snackbar.make(view,"CAMERAYA ERİŞİM İZNİ GEREKLİ",Snackbar.LENGTH_INDEFINITE).setAction("İZİN VER", new View.OnClickListener() { @Override public void onClick(View view) { //İZİN İSTE permissionLauncher.launch(Manifest.permission.ACCESS_BACKGROUND_LOCATION); } }).show(); }else{ //İZİN İSTE permissionLauncher.launch(Manifest.permission.ACCESS_BACKGROUND_LOCATION); } }else{ // İZİN VERİLDİ startLocationService(); } } } private boolean isLocationServiceRunning(){ ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); if (activityManager!=null){ for (ActivityManager.RunningServiceInfo service: activityManager.getRunningServices(Integer.MAX_VALUE)){ if (LocationService.class.getName().equals(service.service.getClassName())){ if (service.foreground){ return true; } } } return false; } return false; } private void startLocationService(){ Intent intent = new Intent(getApplicationContext(),LocationService.class); intent.setAction(Constants.ACTION_START_LOCATION_SERVICE); startService(intent); Toast.makeText(MainActivity.this, "Location service started", Toast.LENGTH_SHORT).show(); } private void stopLocationService(){ Intent intent = new Intent(getApplicationContext(),LocationService.class); intent.setAction(Constants.ACTION_STOP_LOCATION_SERVICE); startService(intent); Toast.makeText(MainActivity.this, "Location service stopped", Toast.LENGTH_SHORT).show(); } public void registerLauncher(){ permissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), new ActivityResultCallbacklt;Booleangt;() { @Override public void onActivityResult(Boolean result) { if (result){ //İZİN VERİLDİ startLocationService(); }else{ //TOST MESAJI Toast.makeText(MainActivity.this, "CAMERA ERİŞİM İZNİ GEREKLİ", Toast.LENGTH_SHORT).show(); } } }); } }
--MY SERVICE-- import android.Manifest; import android.app.ActivityManager; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Build; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.core.app.ActivityCompat; import androidx.core.app.NotificationCompat; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import com.google.android.gms.location.LocationCallback; import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationResult; import com.google.android.gms.location.LocationServices; public class LocationService extends Service { double latitude; double longitude; private LocationCallback locationCallback = new LocationCallback() { @Override public void onLocationResult(@NonNull LocationResult locationResult) { super.onLocationResult(locationResult); if (locationResult != null amp;amp; locationResult.getLastLocation() != null) { latitude = locationResult.getLastLocation().getLatitude(); longitude = locationResult.getLastLocation().getLongitude(); } } }; @Nullable @Override public IBinder onBind(Intent intent) { throw new UnsupportedOperationException("NOT YET IMPLEMENTED"); } @RequiresApi(api = Build.VERSION_CODES.O) private void startLocationService() { String channelId = "location_notification_channel"; NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); Intent resultIntent = new Intent(); PendingIntent pendingIntent = PendingIntent.getActivity( getApplicationContext(), 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT ); NotificationCompat.Builder builder = new NotificationCompat.Builder( getApplicationContext(), channelId ); builder.setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("LOCATION SERVICE RUNNING") .setDefaults(NotificationCompat.DEFAULT_ALL) .setContentText("RUNNING") .setContentIntent(pendingIntent) .setAutoCancel(false) .setPriority(NotificationCompat.PRIORITY_MAX); if (Build.VERSION.SDK_INT gt;= Build.VERSION_CODES.BASE) { if (notificationManager != null amp;amp; notificationManager.getNotificationChannel(channelId) == null) { NotificationChannel notificationChannel = new NotificationChannel( channelId, "Location Service", NotificationManager.IMPORTANCE_HIGH ); notificationChannel.setDescription("This channel is used by Location Service"); notificationManager.createNotificationChannel(notificationChannel); } } LocationRequest locationRequest = LocationRequest.create() .setInterval(100) .setFastestInterval(3000) .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) .setMaxWaitTime(100); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED amp;amp; ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { return; } LocationServices.getFusedLocationProviderClient(this) .requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper()); startForeground(Constants.LOCATION_SERVICE_ID,builder.build()); } private void stopLocationService(){ LocationServices.getFusedLocationProviderClient(this) .removeLocationUpdates(locationCallback); stopForeground(true); stopSelf(); } @RequiresApi(api = Build.VERSION_CODES.O) @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent!=null){ String action = intent.getAction(); if (action!=null){ if (action.equals(Constants.ACTION_START_LOCATION_SERVICE)){ startLocationService(); }else if(action.equals(Constants.ACTION_STOP_LOCATION_SERVICE)){ stopLocationService(); } } } return super.onStartCommand(intent, flags, startId); } }