Выбор местоположения устройства независимо от того, в каком состоянии находится приложение. Всегда определяйте местоположение из моего корпоративного приложения. - PullRequest
0 голосов
/ 14 января 2020

Я бы хотел узнать местоположение корпоративных устройств с помощью корпоративного приложения.

Я успешно обнаружил устройство, когда приложение находится на переднем плане, но, кажется, не работает, когда приложение находится в фоновом режиме или убито.

Я пытался использовать pu sh уведомление о запуске службы или broadcastReceiver, когда приложение закрыто или находится в фоновом режиме, но ничего не работает.

Есть ли способ получить местоположение устройства независимо от состояния приложения?

AndroidManifest. xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.c7lab.fotodinamico">

    <!--
     io.flutter.app.FlutterApplication is an android.app.Application that
         calls FlutterMain.startInitialization(this); in its onCreate method.
         In most cases you can leave this as-is, but you if you want to provide
         additional functionality it is fine to subclass or reimplement
         FlutterApplication and put your custom class here.
    -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:name="io.flutter.app.FlutterApplication"
        android:icon="@mipmap/ic_launcher"
        android:label="Corporate Application">
        <receiver android:name=".MyLocationService"></receiver>


        <activity
            android:name=".MainActivity"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:windowSoftInputMode="adjustResize">

            <meta-data
                android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
                android:value="true" />

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <intent-filter>
                <action android:name="FLUTTER_NOTIFICATION_CLICK" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>


        <service
            android:name="com.example.crm_agenti.MyFirebaseMessagingService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>
    </application>

</manifest>

MyLocationService.class

package com.c7lab.fotodinamico;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.location.Location;
import android.util.Log;

import com.google.android.gms.location.LocationResult;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import static android.content.Context.MODE_PRIVATE;


public class MyLocationService extends BroadcastReceiver {

    public static final String ACTION_PROCESS_UPDATE = "com.c7lab.fotodinamico.UPDATE_LOCATION";
    private static final String TAG = "MyLocationService";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "MYSERVICE WORK?");
        SharedPreferences prefs = context.getSharedPreferences("FlutterSharedPreferences", MODE_PRIVATE);
        String shared = prefs.getString("flutter.jsonData", null);
        JsonObject ed = new JsonObject();
        Gson g = new Gson();
        if(shared != null) {
            ed = new JsonParser().parse(shared).getAsJsonObject();
        }

        String usr = "no-usr";
        if(ed.get("usr") != null) {
            usr = ed.get("usr").getAsString();
        }
        if(intent != null) {
            final String action = intent.getAction();
            if(ACTION_PROCESS_UPDATE.equals(action)) {
                LocationResult result = LocationResult.extractResult(intent);
                if(result != null) {
                    Location location = result.getLastLocation();
                    double latitude = location.getLatitude();
                    double longitude = location.getLongitude();

                    String location_string = new StringBuilder(""+latitude).append(" - ").append(longitude).toString();
                    Log.v(TAG,location_string);
                }
            }
        }
    }
}

MainActivity.class

package com.c7lab.fotodinamico;

import android.Manifest;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import android.view.WindowManager.LayoutParams;
import android.widget.Toast;

import androidx.core.app.ActivityCompat;

import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;

import com.karumi.dexter.Dexter;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.single.PermissionListener;

import io.flutter.app.FlutterActivity;
import io.flutter.plugins.GeneratedPluginRegistrant;


public class MainActivity extends FlutterActivity {
  private static final String TAG = "MainActivity";
  private Handler mainHandler = new Handler();

  static MainActivity instance;
  LocationRequest locationRequest;
  FusedLocationProviderClient fusedLocationProviderClient;

  public static MainActivity getInstance() {
    return instance;
  }


  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);
    //scheduleJob();
    getWindow().addFlags(LayoutParams.FLAG_SECURE);


    Dexter.withActivity(this)
            .withPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
            .withListener(new PermissionListener() {
              @Override
              public void onPermissionGranted(PermissionGrantedResponse response) {
                  updateLocation();
              }

              @Override
              public void onPermissionDenied(PermissionDeniedResponse response) {
                  Toast.makeText(MainActivity.this, "Accetta permessi posizione.", Toast.LENGTH_SHORT).show();

              }

              @Override
              public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {

              }
            }).check();
  }

  @Override
  protected void onStop() {
    // call the superclass method first
    super.onStop();

  }

    private void updateLocation() {
        buildLocationRequest();
        fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            return;
        }
        fusedLocationProviderClient.requestLocationUpdates(locationRequest, getPendingIntent());
    }

    private PendingIntent getPendingIntent() {
        Intent intent = new Intent(this, com.c7lab.fotodinamico.MyLocationService.class);
        intent.setAction(com.c7lab.fotodinamico.MyLocationService.ACTION_PROCESS_UPDATE);

        return PendingIntent.getBroadcast(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);

    }

    private void buildLocationRequest() {
        locationRequest = new LocationRequest();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(5000);
        locationRequest.setFastestInterval(3000);
        locationRequest.setSmallestDisplacement(10f);
    }


}

Я пробовал несколько решений, написанных на этом сайте!

1 Ответ

0 голосов
/ 14 января 2020

Множество проблем.

1) Не используйте getLastLocation. Это работает, только если устройство уже знает местоположение. Вместо этого используйте requestSingleUpdate для фактического включения аппаратного обеспечения местоположения. Это потребовало от вас использовать реальный сервис, так как BroadcastReceiver был бы убит слишком быстро. BR может запустить службу, хотя.

2) Вам нужна служба переднего плана, а не фоновая служба.

3) В современных android пользователь может выбрать предоставление местоположения только тогда, когда приложение открыто и блокирует весь фоновый доступ. Возможно, владелец политики устройства может переопределить это, не уверен. Но если это невозможно, ты облажался.

...