我在没有太多运气的情况下与NotificationListenerService作斗争.我尝试了很多在这里和那里找到的食谱,特别是这样......但它的作用相当不一致.
首先看一下代码:
清单:
<service
android:name=".services.NLService"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" >
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>
Run Code Online (Sandbox Code Playgroud)
那么服务本身:
public class NLService extends NotificationListenerService {
private String TAG = "NLService";
// bind and unbind seems to make it work with Android 6...
// but is never called with Android 4.4...
@Override
public IBinder onBind(Intent mIntent) {
IBinder mIBinder = super.onBind(mIntent);
Log.i(TAG, "onBind");
return mIBinder;
}
@Override
public boolean onUnbind(Intent mIntent) {
boolean mOnUnbind = super.onUnbind(mIntent);
Log.i(TAG, "onUnbind");
isNotificationAccessEnabled = false;
try {
} catch (Exception …
Run Code Online (Sandbox Code Playgroud) 我发布了一个关于Android 5.1的新行为的问题,该行为在设备上设置设备所有者时会禁用备份服务...
一个可能的解决方案可能是(我猜)使用反射来解决问题:我可以在隐藏类中使用特定方法找到一些反射示例,但这种情况看起来更复杂,使用另一个隐藏类(ServiceManager)的构造函数我不知道如何做到这一点......
令我烦恼的代码位于第3739至3749行的DevicePolicyManagerService.java(可在此处找到):
long ident = Binder.clearCallingIdentity();
try {
IBackupManager ibm = IBackupManager.Stub.asInterface(
ServiceManager.getService(Context.BACKUP_SERVICE));
ibm.setBackupServiceActive(UserHandle.USER_OWNER, false);
} catch (RemoteException e) {
throw new IllegalStateException("Failed deactivating backup service.", e);
} finally {
Binder.restoreCallingIdentity(ident);
}
Run Code Online (Sandbox Code Playgroud)
我的目标是重新启用备份服务,理想情况下,这将调用类似于:
ibm.setBackupServiceActive(UserHandle.USER_OWNER, false);
Run Code Online (Sandbox Code Playgroud)
你能帮帮我吗?
有没有人知道在更新发生时,通过Google Play分发的设备所有者应用程序的生产行为是什么?
我们知道,安装一个设备所有者应用程序需要一些动力并且并不容易:重置为出厂默认设置然后使用第二个设备进行NFC设置等等......所以即使我们考虑完成这一步骤,任何进一步的更新都会涉及到如此多痛苦,每一次?
出现这个问题是因为在我的开发设备上,如果先前安装了更改,我无法重新启动设备所有者应用程序...除非我将设备重置为出厂设置!
谢谢阅读…
使用Lollipop时,我有一个设备所有者应用程序,该设备所有者应用程序在供应时随NFC一起安装。
我现在需要的是处理我的App的自动更新,从Google Play依靠标准的Android App更新系统...
到目前为止,我可以想象完成此任务的2种方法,但是不知道如何处理它们:
我很高兴听到有人能分享有关此类程序的经验。谢谢阅读!
1-在NFC设置中,我用snep://my.app.packagename替换了apk网址,但是没有运气;它只是给出了一个错误而没有太多解释。
2-我用一个PlayStore链接替换了该网址:https : //play.google.com/store/apps/details? id = my.app.packagename, 但是无论我使用本地计算的校验和还是它都会产生校验和错误。 GooglePlay apk详细信息中提供的校验和。它看起来离目标不远,但我无法使其实现。
3-终于我回到了第一个解决方案,一个自托管的apk版本1 ...但是这次,我尝试将PlayPack的应用程序2更新版本,其包名完全相同...这导致我奇怪的事情:
这是一种奇怪的行为吗?如果有人对此有想法,我真的需要能够依赖Play商店的功能,但到目前为止还算不上运气,而且我不敢相信Device-Owner应用分发版与PlayStore不兼容?
以防万一,这里仅供参考,这是我正在使用的那种配置代码:
try {
Properties p = new Properties();
p.setProperty(
DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME,
"my.app.packagename");
p.setProperty(
DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION,
"http://www.example.com/myDeviceOwnerApp.apk");
p.setProperty(
DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM,
"U55o3fO0cXQtUoQCbQEO9c_gKrs");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
OutputStream out = new ObjectOutputStream(bos);
p.store(out, "");
final byte[] bytes = bos.toByteArray();
NdefMessage …
Run Code Online (Sandbox Code Playgroud) 我的设备所有者应用程序出现问题:在 Android 5.1 之前它运行良好,但现在更新到 Android 5.1 后,安装设备所有者应用程序会禁用备份服务。
现在在设备设置中,当进入备份和重置选项时,备份服务是灰色的,表示:备份服务处于非活动状态。这是由您的设备政策设置的
我可以在 google git 存储库上找到这个源代码......代码不是很长且易于理解,他们使用 android.app.backup.IBackupManager 来禁用该服务......但更容易的是提交评论:
设置设备所有者时关闭备份管理器服务
这是他们所做的:
import android.app.backup.IBackupManager;
// Shutting down backup manager service permanently.
long ident = Binder.clearCallingIdentity();
try {
IBackupManager ibm = IBackupManager.Stub.asInterface(
ServiceManager.getService(Context.BACKUP_SERVICE));
ibm.setBackupServiceActive(UserHandle.USER_OWNER, false);
} catch (RemoteException e) {
throw new IllegalStateException("Failed deactivating backup service.", e);
} finally {
Binder.restoreCallingIdentity(ident);
}
Run Code Online (Sandbox Code Playgroud)
哇...这对我的项目来说是一个严重的缺陷!不开玩笑:现在真的不可能让用户在安装设备所有者应用程序时备份他的数据吗?
所以,希望这里有人可以有信息或经验来分享这个?可悲的是,我对此并不熟悉,但也许通过反思可以在事后修复?
感谢您的阅读!