目录

    • 1 安装 apk 时 INSTALL_FAILED_ALREADY_EXISTS
    • 2 getExternalFilesDir 返回 null
    • 3 Manifest merger failed
    • 4 错误: 程序包androidx.databinding不存在
    • 5 Error: Program type already present: android.support.v4.app.INotificationSideChannel
    • 6 Caused by: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
    • 7 使用 `Databinding` 却无法引用到 include 标签内的控件
    • 8 错误: 找不到符号 符号: 类 AppManagerActivityBindingImpl 位置: 程序包 com.bat.clean.databinding
    • 9 API 19 手机上出现 java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" on path
    • 10 NestedScrollView 嵌套 RecyclerView,列表向下滚动的问题

1 安装 apk 时 INSTALL_FAILED_ALREADY_EXISTS

E:\wangzhichao_dir\fusoft\apk>adb install E:\wangzhichao_dir\fusoft\apk\google-play-8-3-73-u-all-0-fp-173262113.apkadb: failed to install E:\wangzhichao_dir\fusoft\apk\google-play-8-3-73-u-all-0-fp-173262113.apk: Failure [INSTALL_FAILED_VERSION_DOWNGRADE]E:\wangzhichao_dir\fusoft\apk>adb uninstall com.android.vendingSuccessE:\wangzhichao_dir\fusoft\apk>adb install E:\wangzhichao_dir\fusoft\apk\google-play-8-3-73-u-all-0-fp-173262113.apkadb: failed to install E:\wangzhichao_dir\fusoft\apk\google-play-8-3-73-u-all-0-fp-173262113.apk: Failure [INSTALL_FAILED_ALREADY_EXISTS: Attempt to re-installcom.android.vending without first uninstalling.]E:\wangzhichao_dir\fusoft\apk>adb uninstall com.android.vendingFailure [DELETE_FAILED_INTERNAL_ERROR]E:\wangzhichao_dir\fusoft\apk>adb uninstall com.android.vendingFailure [DELETE_FAILED_INTERNAL_ERROR]E:\wangzhichao_dir\fusoft\apk>adb install -r E:\wangzhichao_dir\fusoft\apk\google-play-8-3-73-u-all-0-fp-173262113.apkerror: no devices/emulators foundadb: error: failed to get feature set: no devices/emulators found- waiting for device -E:\wangzhichao_dir\fusoft\apk>adb install -r E:\wangzhichao_dir\fusoft\apk\google-play-8-3-73-u-all-0-fp-173262113.apkSuccess

时间:2019年1月31日15:37:16
解决办法:可以看上面的命令,主要是使用了 adb install -r 命令。在这当中,还重启了一次手机。

2 getExternalFilesDir 返回 null

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.io.File.getPath()' on a null object reference

下面这段代码,在友盟统计上上报了异常:

public static String getFileDir(String folder) {    Context context = MyApplication.getContext();    String cachePath = null;    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())            || !Environment.isExternalStorageRemovable()) {        cachePath = context.getExternalFilesDir(folder).getPath();    } else {        cachePath = context.getFilesDir().getPath() + File.separator + folder;    }    return cachePath;}

时间:2019年1月31日16:47:13
解决办法:if 分支里的 || 应该写为 &&,因为在存储卡没有 MEDIA_MOUNTED 但也没有移除时,会进入 if 分支,这种情况下 context.getExternalFilesDir(folder) 会返回 null
另外,即便存储卡已经是 MEDIA_MOUNTED 状态,context.getExternalFilesDir(folder) 也可能返回 null,造成异常(参考:https://stackoverflow.com/questions/27463407/getexternalfilesdirnull-returns-null-for-some-users )。所以,需要对 context.getExternalFilesDir(folder) 做非空校验。
修改后的代码如下:

public static String getFileDir(String folder) {    Context context = MyApplication.getContext();    String cachePath;    if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())            && !Environment.isExternalStorageRemovable()            && (context.getExternalFilesDir(folder) != null)) {            cachePath = context.getExternalFilesDir(folder).getPath();    } else {        cachePath = context.getFilesDir().getPath() + File.separator + folder;    }    File file = new File(cachePath);    if (!file.isDirectory()) {        boolean mkdirs = file.mkdirs();        LogUtils.d("getFileDir: mkdirs="+mkdirs);    }    return cachePath;

3 Manifest merger failed

错误日志如下:

Manifest merger failed : Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from [com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18-91is also present at [androidx.core:core:1.0.0] AndroidManifest.xml:22:18-86 value=(androidx.core.app.CoreComponentFactory).Suggestion: add 'tools:replace="android:appComponentFactory"' to  element at AndroidManifest.xml:11:5-36:19 to override.

从错误日志可以看到,appComponentFactory 在 com.android.support:support-compat:28.0.0 里存在,也在 androidx.core:core:1.0.0 里存在,导致合并失败。可以我没有去引用 androidx.core:core:1.0.0。查看我的 External libraries,确实看到了 androidx.core:core:1.0.0 的一大堆引用。它们是怎么进来的呢?
在 Terminal 里输入命令:

gradlew :app:dependencies

看到了:

是因为引用了这个第三方库才有了 androidx 的库。
修改依赖方式,移除不需要的 group:

implementation ("org.permissionsdispatcher:permissionsdispatcher:$rootProject.permissionsdispatcher_version"){        exclude group: 'androidx.core'        exclude group: 'androidx.fragment'        exclude group: 'androidx.collection'}

4 错误: 程序包androidx.databinding不存在

时间:2019年2月18日21:16:43
解决办法:在 gradle.properties 文件中添加

android.useAndroidX=true

当设置为true时,Android 插件使用合适的AndroidX库而非一个Support库。

5 Error: Program type already present: android.support.v4.app.INotificationSideChannel

时间:2019年2月18日21:23:05
解决办法:在 gradle.properties 文件中添加

android.enableJetifier=true

参考官方文档 Using AndroidX:

android.enableJetifier: When set to true, the Android plugin automatically migrates existing third-party libraries to use AndroidX by rewriting their binaries. The flag is false by default if it is not specified.

6 Caused by: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.

时间:2019年2月21日14:08:43
解决办法:修改 Activity 的 theme 为

<style name="AppTheme.NoActionBar">        "windowActionBar">false        "windowNoTitle">truestyle>

7 使用 Databinding 却无法引用到 include 标签内的控件

时间:2019年2月21日14:12:21
解决办法:

  1. 标签引用的布局转成 Databinding 需要的 layout 节点的布局,如 databinding_include_textview.xml
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android">    <data>    data>    <TextView        android:id="@+id/tv"        android:layout_width="100dp"        android:background="#44ff0000"        android:text="I am an include textview."        android:layout_height="100dp"/>layout>
  1. 标签所在的布局转成 Databinding 需要的 layout 节点的布局。
    在代码中获取对应控件的方式,如 activity_databinding_include.xml
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android">    <data>    data>    <android.support.constraint.ConstraintLayout        android:layout_width="match_parent"        android:layout_height="match_parent">        <include            layout="@layout/databinding_include_textview"/>    android.support.constraint.ConstraintLayout>layout>
  1. 标签添加 id:
<include            android:id="@+id/include_textview"            layout="@layout/databinding_include_textview"/>
  1. 在代码中获取 TextView 的方式:
ActivityDatabindingIncludeBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_databinding_include);        binding.includeTextview.tv.setText("Study hard.");

8 错误: 找不到符号 符号: 类 AppManagerActivityBindingImpl 位置: 程序包 com.bat.clean.databinding

时间:2019年2月26日11:05:26
解决办法:查看 Run tasks 下报错的 :app:compileDebugJavaWithJavac 这个任务,显示出来的日志:

java.lang.RuntimeException: android.databinding.tool.util.LoggedErrorException: Found data binding errors.****/ data binding error ****msg:Could not find accessor android.view.View.VISBLEfile:E:\AndroidWorkspaces\BatCleaner\app\src\main\res\layout\app_manager_activity.xmlloc:66:64 - 66:74

可以看到这句:

Could not find accessor android.view.View.VISBLE

原来是自己把 View.VISIBLE 写成了 View.VISBLE。

<ProgressBar                android:id="@+id/pb"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_gravity="center"                android:visibility="@{viewmodel.mShowProgress ? View.VISBLE: View.GONE}"/>

改为

<ProgressBar                android:id="@+id/pb"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_gravity="center"                android:visibility="@{viewmodel.mShowProgress ? View.VISIBLE: View.GONE}"/>

改过来,重新运行,ok 了。学习到的一点是一定要认真查看日志,大多数情况下日志中都已经包含了出错的地方;有时候还会给出建议的解决办法。

9 API 19 手机上出现 java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.ClassNotFoundException: Didn’t find class “com.google.firebase.provider.FirebaseInitProvider” on path

错误日志如下:

java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" on path: DexPathList[[zip file "/data/app/com.bat.clean-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.bat.clean-1, /vendor/lib, /system/lib]]        at android.app.ActivityThread.installProvider(ActivityThread.java:5018)        at android.app.ActivityThread.installContentProviders(ActivityThread.java:4589)        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4522)        at android.app.ActivityThread.access$1500(ActivityThread.java:151)        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1381)        at android.os.Handler.dispatchMessage(Handler.java:110)        at android.os.Looper.loop(Looper.java:193)        at android.app.ActivityThread.main(ActivityThread.java:5299)        at java.lang.reflect.Method.invokeNative(Native Method)        at java.lang.reflect.Method.invoke(Method.java:515)        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825)        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641)        at dalvik.system.NativeStart.main(Native Method)     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider" on path: DexPathList[[zip file "/data/app/com.bat.clean-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.bat.clean-1, /vendor/lib, /system/lib]]        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)        at java.lang.ClassLoader.loadClass(ClassLoader.java:497)        at java.lang.ClassLoader.loadClass(ClassLoader.java:457)        at android.app.ActivityThread.installProvider(ActivityThread.java:5003)        at android.app.ActivityThread.installContentProviders(ActivityThread.java:4589)         at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4522)         at android.app.ActivityThread.access$1500(ActivityThread.java:151)         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1381)         at android.os.Handler.dispatchMessage(Handler.java:110)         at android.os.Looper.loop(Looper.java:193)         at android.app.ActivityThread.main(ActivityThread.java:5299)         at java.lang.reflect.Method.invokeNative(Native Method)         at java.lang.reflect.Method.invoke(Method.java:515)         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825)         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641)         at dalvik.system.NativeStart.main(Native Method) 

时间:2019年2月28日15:39:38
解决办法:

  1. 添加 multidex 依赖:
dependencies {  implementation 'com.android.support:multidex:1.0.3'}
  1. 在主 module 的 gradle 文件中添加:
 defaultConfig {        ...        multiDexEnabled true    }
  1. 在自定义的 Application 类中添加:
@Overrideprotected void attachBaseContext(Context base) {    super.attachBaseContext(base);    MultiDex.install(this);}

参考 https://stackoverflow.com/questions/39825543/didnt-find-class-com-google-firebase-provider-firebaseinitprovider

10 NestedScrollView 嵌套 RecyclerView,列表向下滚动的问题

问题描述:在 NestedScrollView 里嵌套 RecyclerView,加载完数据后,发现列表已经向下滚动了。
时间:2019年2月28日21:32:16
解决办法:
设置

 // 避免 recyclerview 刚打开页面就向下滚动 recyclerview .setFocusable(false);

参考 https://www.jianshu.com/p/3e710a5ee50b
另外发现,在 NestedScrollView 中嵌套 RecyclerView 后,RecyclerViewAdapter 中的回调在加载完数据后,即便再滚动列表也不会重新走 onCreateViewHolderonBindViewHolder 的回调了。这个问题,还不知道原因。

更多相关文章

  1. 修改应用按键无响应的时间
  2. Android开发遇到的问题
  3. Android实现自己的回调函数
  4. android提示错误: The process android.process.acore has stoppe
  5. 2010.11.28(3)———android AlertDialog:android.view.WindowMan
  6. Android(安卓)出现open failed: EACCES (Permission denied)错误
  7. Error:Execution failed for task ':app:processDebugManifest'.
  8. android 使用DataBinding问题总结
  9. Android(安卓)studio build inished with non-zero exit value 1

随机推荐

  1. 面试官:手写一个插入排序,并对其改进
  2. 面试官:如何在十亿个单词字典中,判断某个单
  3. java集合系列(8)HashMap(源码分析,强烈推荐!!!)
  4. 序列化系列(3)protostuff
  5. java远程调用之RMI(终于可以自己写代码控
  6. java多线程(2)线程生命周期和常见API
  7. LeetCode:广度优先搜索(BFS)算法(常见面试
  8. Android(安卓)通知栏Notification的整合
  9. Shiro安全框架(1)入门基础案例
  10. 测试 Android(安卓)G1 是否支持 OpenGL