来自Google的新Geofencing API在应用程序停止运行时不会触发任何事件。我尝试使用PendingIntent.getBroadcast()
和PendingIntent.getService()
但只能在应用程序打开时获取转换事件。
我从代码实验室学习了this教程,但修改了代码以使用新的GeofencingClient
更新
这是我创建待定意图的方式:
private PendingIntent getGeofencePendingIntent() {
if (mGeofencePendingIntent != null) {
Log.d(TAG, "Pending intent is already there");
return mGeofencePendingIntent;
}
Log.d(TAG, "Creating a new pending intent");
// In case I'm using Service, the second parameter will be GeoIntentService.class
Intent mIntent = new Intent(mContext, GeoReceiver.class);
// In case I'm using Service, the method will be getService(...)
mGeofencePendingIntent = PendingIntent.getBroadcast(mContext, 0, mIntent, PendingIntent.FLAG_UPDATE_CURRENT);
return mGeofencePendingIntent;
}
我的GeoReceiver的onReceive
方法中的代码。在onHandleIntent
方法
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "onReceive");
if (intent == null) {
Log.e(TAG, "Intent is null");
return;
}
final String action = intent.getAction();
if (ACTION_ADD_GEOFENCE.equals(action)) {
GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent);
if (geofencingEvent.hasError()) {
String errMsg = GeofenceExceptionMessages.getErrorString(context, geofencingEvent.getErrorCode());
Log.e(TAG, "onReceive Error: " + errMsg);
return;
}
int geofenceTransition = geofencingEvent.getGeofenceTransition();
if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER ||
geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) {
List<Geofence> triggeringGeofences = geofencingEvent.getTriggeringGeofences();
NotificationHelper helper = new NotificationHelper();
String geofenceTransitionDetails = helper.getGeofenceTransitionDetails(
context,
geofenceTransition,
triggeringGeofences
);
helper.sendNotificaiton(context, geofenceTransitionDetails);
Log.i(TAG, "onReceive: " + geofenceTransitionDetails);
}
} else {
Log.d(TAG, "Diffirent Action: " + action);
}
}
答案 0 :(得分:0)
Geofencing无法正常工作,因为某些设备默认只允许某些白名单应用的后台服务。如果您的应用也必须像这样工作,则意味着您必须从设置启用自动启动,以下代码将帮助您让用户为您的应用启用自动启动。如果自动启动是启用后,您的服务将在后台运行良好。
为了提高手机的性能,一些公司将停止该应用的所有后台服务(“一些白名单应用只会获得在后台提供服务的许可,例如:WhatsApp,Google Apps和公认的应用程序。”如果我们的应用程序也必须像这样工作,我们必须启用自动启动服务。
<强>自动启动强>
当Android系统启动时,它会发出启动完成事件。 Android应用程序可以侦听和捕获此事件以执行特定操作,例如自动启动活动或服务。
截至目前,无法确定是否启用了 AutoStart 。 因此,您可以将它们重定向到设置并告诉用户启用它。我为大多数普通电话的公司提供重定向的代码,这些代码会杀死后台服务。(仅向用户显示一次,使用SharedPreference管理它,如前所述无法确定是启用还是禁用。)
要实现这一目标,
在 AndroidManifest.xml 中声明权限。在应用程序声明节点之前,将 android.permission.RECEIVE_BOOT_COMPLETED 权限添加到应用程序的清单文件中:
这是必须调用的功能代码。
private void enableAutoStart() {
if (Build.BRAND.equalsIgnoreCase("xiaomi")) {
new MaterialDialog.Builder(MainActivity.this).title("Enable AutoStart")
.content(
"Please allow AppName to always run in the background,else our services can't be accessed.")
.theme(Theme.LIGHT)
.positiveText("ALLOW")
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.miui.securitycenter",
"com.miui.permcenter.autostart.AutoStartManagementActivity"));
startActivity(intent);
}
})
.show();
} else if (Build.BRAND.equalsIgnoreCase("Letv")) {
new MaterialDialog.Builder(MainActivity.this).title("Enable AutoStart")
.content(
"Please allow AppName to always run in the background,else our services can't be accessed.")
.theme(Theme.LIGHT)
.positiveText("ALLOW")
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.letv.android.letvsafe",
"com.letv.android.letvsafe.AutobootManageActivity"));
startActivity(intent);
}
})
.show();
} else if (Build.BRAND.equalsIgnoreCase("Honor")) {
new MaterialDialog.Builder(MainActivity.this).title("Enable AutoStart")
.content(
"Please allow AppName to always run in the background,else our services can't be accessed.")
.theme(Theme.LIGHT)
.positiveText("ALLOW")
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.huawei.systemmanager",
"com.huawei.systemmanager.optimize.process.ProtectActivity"));
startActivity(intent);
}
})
.show();
} else if (Build.MANUFACTURER.equalsIgnoreCase("oppo")) {
new MaterialDialog.Builder(MainActivity.this).title("Enable AutoStart")
.content(
"Please allow AppName to always run in the background,else our services can't be accessed.")
.theme(Theme.LIGHT)
.positiveText("ALLOW")
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
try {
Intent intent = new Intent();
intent.setClassName("com.coloros.safecenter",
"com.coloros.safecenter.permission.startup.StartupAppListActivity");
startActivity(intent);
} catch (Exception e) {
try {
Intent intent = new Intent();
intent.setClassName("com.oppo.safe",
"com.oppo.safe.permission.startup.StartupAppListActivity");
startActivity(intent);
} catch (Exception ex) {
try {
Intent intent = new Intent();
intent.setClassName("com.coloros.safecenter",
"com.coloros.safecenter.startupapp.StartupAppListActivity");
startActivity(intent);
} catch (Exception exx) {
}
}
}
}
})
.show();
} else if (Build.MANUFACTURER.contains("vivo")) {
new MaterialDialog.Builder(MainActivity.this).title("Enable AutoStart")
.content(
"Please allow AppName to always run in the background.Our app runs in background else our services can't be accesed.")
.theme(Theme.LIGHT)
.positiveText("ALLOW")
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
try {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.iqoo.secure",
"com.iqoo.secure.ui.phoneoptimize.AddWhiteListActivity"));
startActivity(intent);
} catch (Exception e) {
try {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.vivo.permissionmanager",
"com.vivo.permissionmanager.activity.BgStartUpManagerActivity"));
startActivity(intent);
} catch (Exception ex) {
try {
Intent intent = new Intent();
intent.setClassName("com.iqoo.secure",
"com.iqoo.secure.ui.phoneoptimize.BgStartUpManager");
startActivity(intent);
} catch (Exception exx) {
ex.printStackTrace();
}
}
}
}
})
.show();
}
}