android - “试图向 Flutter 发送平台消息,但 FlutterJNI 与原生 C++ 分离。” 启动后台服务并关闭应用程序后
问题描述
我正在尝试构建一个使用一些包作为位置(https://pub.dev/packages/location)和指南针(https://pub.dev/packages/flutter_compass)的应用程序,并保持后台服务跟踪用户位置. 一切正常,直到我启动服务来跟踪位置。
当服务处于活动状态时,整个应用程序永远不会停止,例如,当我在没有服务的情况下关闭应用程序时,指南针也会停止,但随着服务的运行,指南针也会继续运行。实际上它返回一个错误“尝试向 Flutter 发送平台消息,但 FlutterJNI 已与本机 C++ 分离。无法发送。频道:hemanthraj/flutter_compass”。位置发生了同样的事情:“尝试向 Flutter 发送平台消息,但 FlutterJNI 与本机 C++ 分离。无法发送。频道:lyokone/locationstream”。在此之后,即使我再次打开该项目,它也不再起作用......我正在尝试使服务完全独立于项目的其余部分。
我将向您展示服务实现(Android)
public class CompassApplication extends FlutterApplication {
@Override
public void onCreate() {
super.onCreate();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel("messages", "Messages", NotificationManager.IMPORTANCE_LOW);
NotificationManager manager = getSystemService(NotificationManager.class);
if (manager != null) {
manager.createNotificationChannel(channel);
}
}
}
}
class MainActivity: FlutterActivity() {
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine)
val intent = Intent(this, LocationService::class.java)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent)
} else {
startService(intent)
}
}
}
public class LocationService extends Service {
static final long UPDATE_INTERVAL_IN_MILLISECONDS = 10 * 60 * 1000; // 10 minutes
static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = UPDATE_INTERVAL_IN_MILLISECONDS / 2;
private LocationRequest mLocationRequest;
private FusedLocationProviderClient mFusedLocationClient;
private LocationCallback mLocationCallback;
@Override
public void onCreate() {
super.onCreate();
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
super.onLocationResult(locationResult);
onNewLocation(locationResult.getLastLocation());
}
};
createLocationRequest();
getLastLocation();
requestLocationUpdates();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "messages")
.setSmallIcon(R.mipmap.ic_launcher_foreground);
startForeground(101, builder.build());
}
}
private void createLocationRequest() {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}
private void getLastLocation() {
try {
mFusedLocationClient.getLastLocation()
.addOnCompleteListener(task -> {
if (task.isSuccessful() && task.getResult() != null) {
onNewLocation(task.getResult());
}
});
} catch (SecurityException ignored) {}
}
public void requestLocationUpdates() {
Utils.setRequestingLocationUpdates(this, true);
startService(new Intent(getApplicationContext(), LocationUpdatesService.class));
try {
mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
} catch (SecurityException unlikely) {
Utils.setRequestingLocationUpdates(this, false);
}
}
private void onNewLocation(Location location) {
// TODO: deal with current location
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
另一个问题是即使我不关闭应用程序,它也会消耗大量电池。谢谢!
解决方案
将以下代码添加到本机 android mainActivity.kt
package <your.package.name>
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant
class MainActivity: FlutterActivity() {
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
}
}
推荐阅读
- mqtt - 使用 NodeMCU 板通过 MQTT 代理订阅多个发布者
- c - 如何指定正确的“返回类型”?
- swisscomdev - Swisscom S3 动态存储 - 带有 boto3 的签名版?
- node.js - 如何为 Gmail 手表推送通知 API 应用过滤器
- php - mysql查询的一些帮助
- swift - 如何在swift4中创建一个串行队列
- angular - 移动和网络的单一代码库
- exception-handling - 使用 MSTest 从 asmx Web 服务中获取真正的异常类
- matlab - MATLAB如何依次调出一个文件夹中的所有图像?
- windows - 为什么 Windows 上的 Hadoop 尝试连接 0.0.0.0:10020(不成功)?