我知道可以在清单中声明活动,因为它们被排除在以下位置android:excludeFromRecents:http:
//developer.android.com/guide/topics/manifest/activity-element.html#exclude
但是,这不是我想要的,我想知道是否有办法以编程方式从最近的应用程序中删除应用程序
我有一个非常简单的问题:
是否还是无法充气视图(不将它添加到布局)在后台线程(例如:在doInBackground的AsyncTask)?
我知道这是可能的,因为我已经在我的应用程序中以这种方式实现了大多数活动并且从未出现过问题,直到我在Galaxy S上遇到此问题: Android:android.view.InflateException:二进制XML文件行#13:错误在SAMSUNG Galaxy S中膨胀类<未知>
我被告知我不应该Views在后台线程中膨胀,但具体原因是什么,为什么我的aproach在大多数设备中工作但在Galaxy S中没有?
首先,我已经看到 Android 4.2 在Android 4.2 和提供的解决方案上破坏了我的AES加密/解密代码 和 加密错误:
SecureRandom sr = null;
if (android.os.Build.VERSION.SDK_INT >= JELLY_BEAN_4_2) {
sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
} else {
sr = SecureRandom.getInstance("SHA1PRNG");
}
Run Code Online (Sandbox Code Playgroud)
对我不起作用,因为,当解码Android 4.2中Android <4.2加密的数据时,我得到:
javax.crypto.BadPaddingException: pad block corrupted
at com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(BaseBlockCipher.java:709)
Run Code Online (Sandbox Code Playgroud)
我的代码很简单,直到Android 4.2才开始工作:
public static byte[] encrypt(byte[] data, String seed) throws Exception {
KeyGenerator keygen = KeyGenerator.getInstance("AES");
SecureRandom secrand = SecureRandom.getInstance("SHA1PRNG");
secrand.setSeed(seed.getBytes());
keygen.init(128, secrand);
SecretKey seckey = keygen.generateKey();
byte[] rawKey = seckey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES");
Cipher cipher = …Run Code Online (Sandbox Code Playgroud) 我有一些来自Android市场的崩溃报告日志,类似于:
Exception class: java.lang.ClassNotFoundException
Source method: PathClassLoader.findClass()
java.lang.RuntimeException: Unable to start activity ComponentInfo{my.app.package/my.app.package.MyActivity}: java.lang.RuntimeException: Parcelable encounteredClassNotFoundException reading a Serializable object (name = my.app.package.a.ae)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2833)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2854)
at android.app.ActivityThread.access$2300(ActivityThread.java:136)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2179)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:5068)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: Parcelable encounteredClassNotFoundException reading a Serializable object (name = my.app.package.a.ae)
at android.os.Parcel.readSerializable(Parcel.java:1951)
at android.os.Parcel.readValue(Parcel.java:1822)
at android.os.Parcel.readMapInternal(Parcel.java:2008)
at android.os.Bundle.unparcel(Bundle.java:208)
at android.os.Bundle.getBundle(Bundle.java:1078)
at android.app.Activity.onRestoreInstanceState(Activity.java:861)
at android.app.Activity.performRestoreInstanceState(Activity.java:835)
at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1135)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2811)
... …Run Code Online (Sandbox Code Playgroud) 如果可用,我希望我的应用程序访问GPS /网络位置.我不希望Google Play过滤掉没有GPS /网络定位器的设备.
我该怎么做?
目前我的清单上有这个:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.telephony" android:required="false" />
<uses-feature android:name="android.hardware.location" android:required="false" />
Run Code Online (Sandbox Code Playgroud)
但是,我不确定这是否足够,因为http://developer.android.com/guide/topics/manifest/uses-feature-element.html#permissions-features声明:
-permission ACCESS_COARSE_LOCATION意味着android.hardware.location.network和
android.hardware.location功能要求
-permission*ACCESS_FINE_LOCATION意味着android.hardware.location.gps和
android.hardware.location
难道我还必须添加
<uses-feature android:name="android.hardware.location.network" android:required="false" />
和
<uses-feature android:name="android.hardware.location.gps" android:required="false" />?
为什么?
应该<uses-feature android:name="android.hardware.location" android:required="false" />不够?
我想知道是否有永久存储少量数据的方法.
永久地,我的意思是即使用户清除应用数据/卸载应用,我也希望数据能够持久存在.
我知道当用户清除应用数据/卸载应用时,共享首选项和数据库将被删除.
我也知道我可以在SD卡上保存东西,但是如果没有安装SD卡/ SD卡的设备怎么办?
我认为最好的选择是将数据保存在设备内部存储器中,但是在清除应用数据/卸载应用程序时,是否可以在不删除数据的情况下执行此操作?
我有一个Blackberry应用程序,当在一些具有触摸支持的仿真器中运行时(例如:9500,9520,9530,9550),终止于:
"应用程序没有响应;进程XPTO终止"
使用日志,我发现应用程序似乎停止在我异步发出HTTP请求的类中:类似于:
public class LoadingFullScreen extends FullScreen implements Runnable {
private Thread actionThread = null;
protected void onDisplay() {
actionThread = new Thread(this);
actionThread.start();
}
protected void onUndisplay() {
if(actionThread != null && actionThread.isAlive()) {
actionThread.interrupt();
}
}
public void run() {
//make http requests - this is done successfully
synchronized(Application.getEventLock()) {
Screen active = UiApplication.getUiApplication().getActiveScreen();
if (active instanceof LoadingFullScreen) {
Logger.debug("LoadingFullScreen popping screen"); //this appears in logs
UiApplication.getUiApplication().popScreen(active);
Logger.debug("LoadingFullScreen screen popped"); //this never appears in logs
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个奇怪的错误,似乎只发生在三星Galaxy S与Android 2.2(我已经测试了摩托罗拉Milestone 2 Android 2.2/Xperia X10 Android 1.6/Nexus One Android 2.2 /谷歌G1 Android 1.5和1.5仿真器和在这样的设备中,不会发生错误).
完整的堆栈跟踪是:
ERROR/AndroidRuntime(28111): FATAL EXCEPTION: AsyncTask #2
ERROR/AndroidRuntime(28111): java.lang.RuntimeException: An error occured while executing doInBackground()
ERROR/AndroidRuntime(28111): at android.os.AsyncTask$3.done(AsyncTask.java:200)
ERROR/AndroidRuntime(28111): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
ERROR/AndroidRuntime(28111): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
ERROR/AndroidRuntime(28111): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
ERROR/AndroidRuntime(28111): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
ERROR/AndroidRuntime(28111): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
ERROR/AndroidRuntime(28111): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
ERROR/AndroidRuntime(28111): at java.lang.Thread.run(Thread.java:1096)
ERROR/AndroidRuntime(28111): Caused by: android.view.InflateException: Binary XML file line #13: Error inflating class <unknown>
ERROR/AndroidRuntime(28111): at android.view.LayoutInflater.createView(LayoutInflater.java:513)
ERROR/AndroidRuntime(28111): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
ERROR/AndroidRuntime(28111): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)
ERROR/AndroidRuntime(28111): at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
ERROR/AndroidRuntime(28111): at …Run Code Online (Sandbox Code Playgroud) 这个问题询问如何知道Android Talkback是否有效; 直到果冻豆工作.从Android 4.1开始,该步骤不再起作用,因为提到的游标为空.
说完这个,我想问一下是否有办法在Jelly Bean中进行相同的检查.
编辑 我试图搜索TalkBack代码,我在这里找到它.要检查TalkBack是否处于活动状态,我使用以下代码:
Intent screenReaderIntent = new Intent("android.accessibilityservice.AccessibilityService");
screenReaderIntent.addCategory("android.accessibilityservice.category.FEEDBACK_SPOKEN");
List<ResolveInfo> screenReaders = getPackageManager().queryIntentServices(screenReaderIntent, 0);
Cursor cursor = null;
ContentResolver cr = getContentResolver();
for (ResolveInfo screenReader : screenReaders) {
cursor = cr.query(Uri.parse("content://" + screenReader.serviceInfo.packageName
+ ".providers.StatusProvider"), null, null, null, null);
//here, cursor is not null, but calling cursor.moveToFirst() returns false, which means the cursor is empty
}
Run Code Online (Sandbox Code Playgroud)
有了这个说,如果光标为空,我们怎么知道TalkBack是否正在运行?
编辑2 在@JoxTraex建议之后,我现在发送广播来查询是否启用了TalkBack:
Intent i = new Intent();
i.setAction("com.google.android.marvin.talkback.ACTION_QUERY_TALKBACK_ENABLED_COMMAND");
sendBroadcast(i);
Run Code Online (Sandbox Code Playgroud)
现在我应该如何收到回复?
我尝试将以下内容添加到清单中,但我的接收方没有收到任何响应:
<receiver android:name="my.package.MyBroadcastReceiver"
android:permission="com.google.android.marvin.talkback.PERMISSION_SEND_INTENT_BROADCAST_COMMANDS_TO_TALKBACK">
<intent-filter> …Run Code Online (Sandbox Code Playgroud) 我的想法是,SQLite日志仅在有未决操作时才会保留在文件系统中。
但是,在我看来,至少在Android 4.1+中,即使将事务设置为成功/结束,甚至关闭数据库,SQLite日记的正常行为仍保留在文件系统中。
有人对为什么以及何时改变这种行为有想法吗?
在我们的项目中,我们一直在成功使用:
一切正常,直到上周我们升级到gradle plugin 3.2.0。
在此版本中,如果我们具有以下proguard配置以删除对Log的调用:
-assumenosideeffects class android.util.Log { *; }
Run Code Online (Sandbox Code Playgroud)
在运行应用程序时,我们得到:
java.lang.VerifyError:验证程序拒绝类com.google.firebase.FirebaseApp:void com.google.firebase.FirebaseApp。()无法验证:void com.google.firebase.FirebaseApp。():[0x37]注册v0具有类型未初始化参考:java.lang.Object分配PC:53,但预期参考:java.lang.Object void com.google.firebase.FirebaseApp。(android.content.Context,java.lang.String,com.google.firebase。 b)无法验证:无效com.google.firebase.FirebaseApp。(android.content.Context,java.lang.String,com.google.firebase.b):[0x3C]寄存器v8的类型为未初始化参考:com.google .firebase.internal.a分配PC:58,但预期参考:com.google.firebase.FirebaseApp $ a com.google.firebase.FirebaseApp com.google.firebase.FirebaseApp.a(android.content.Context,com.google。 firebase.b,java.lang.String)无法验证:com.google.firebase.FirebaseApp com.google.firebase.FirebaseApp.a(android.content.Context,com.google.firebase.b,java.lang.String):[0x17]寄存器v1具有未初始化的引用类型:com。 google.firebase.FirebaseApp $ 1分配PC:21,但预期参考:com.google.android.gms.common.api.internal.a $ a(“ com.google.firebase.FirebaseApp”的声明出现在/ data / app / com.example.app-2 / base.apk)`
如果我们删除该配置以剥离Log所有调用,就可以了,就像gradle插件(3.1.4)的先前版本中那样。
有谁知道这可能是什么原因?
android ×11
exception ×2
inflate ×2
blackberry ×1
blocking ×1
bouncycastle ×1
crash ×1
cryptography ×1
emulation ×1
file ×1
firebase ×1
gpu ×1
java ×1
sd-card ×1
sqlite ×1
storage ×1
talkback ×1
verifyerror ×1