Android 開發中遇到的 bug(5)

前言

記錄開發中遇到的 bug,不再讓自己重複地被同樣的 bug 折磨。

正文

1 Android 8.0後notification通知聲音無法關閉或開啓的問題

時間:2019年3月19日11:38:39
解決辦法:參考了 https://blog.csdn.net/fzkf9225/article/details/81119780。需要特別注意的是,要記得更新 channelId,新的設置纔會生效。

2 Android 8.0獲取wifi ssid 爲 unknow ssid 的問題

時間:2019年3月19日14:40:10
解決辦法:

// 在 8.0 以上使用,避免獲取到的名字爲 <unknown ssid>
ConnectivityManager cm = (ConnectivityManager) Utils.getApp().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
String ssid= networkInfo.getExtraInfo();

還有一種辦法,增加定位權限:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

這個還需要動態申請,還需要在 app 裏特別說明,有點麻煩。

3. fatal: Not a valid object name: ‘master’.

時間:2019年3月21日10:53:14
問題描述:在一個名字爲 gitskill 的目錄,使用 git init 初始化這個目錄;然後使用 git branch dev 創建 dev 分支,出現這個錯誤。命令使用如下:

wangzhichao@wangzhichao-PC MINGW64 ~/Desktop/gitskill
$ git init
Initialized empty Git repository in C:/Users/wangzhichao/Desktop/gitskill/.git/
wangzhichao@wangzhichao-PC MINGW64 ~/Desktop/gitskill (master)
$ git branch dev
fatal: Not a valid object name: 'master'.

問題分析:使用 git branch 命令查看一下分支狀況,如下:

wangzhichao@wangzhichao-PC MINGW64 ~/Desktop/gitskill (master)
$ git branch

wangzhichao@wangzhichao-PC MINGW64 ~/Desktop/gitskill (master)
$

是的,沒有看錯,沒有分支存在。連 master 分支都不存在。實際上,git init 並不會創建 master 分支,直到完成了第一次 commit。查看下面的命令:

wangzhichao@wangzhichao-PC MINGW64 ~/Desktop/gitskill (master)
$ git st
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        HelloWorld.java

nothing added to commit but untracked files present (use "git add" to track)

wangzhichao@wangzhichao-PC MINGW64 ~/Desktop/gitskill (master)
$ git add .

wangzhichao@wangzhichao-PC MINGW64 ~/Desktop/gitskill (master)
$ git branch

wangzhichao@wangzhichao-PC MINGW64 ~/Desktop/gitskill (master)
$ git commit -m "commit HelloWorld.java"
[master (root-commit) 7fcf75a] commit HelloWorld.java
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 HelloWorld.java

wangzhichao@wangzhichao-PC MINGW64 ~/Desktop/gitskill (master)
$ git branch
* master

wangzhichao@wangzhichao-PC MINGW64 ~/Desktop/gitskill (master)
$

解釋一下,在 add 了 HelloWorld.java 後,依然沒有 master 分支;只有在 commit 了 HelloWorld.java 後,纔有了 master 分支。

4. /system/bin/sh: grep: can’t execute: Permission denied

時間:2019年3月21日13:06:59
問題描述:

C:\Users\wangzhichao>adb shell "top|grep com.bat.clean"
/system/bin/sh: grep: can't execute: Permission denied

解決辦法:
換取一個 root 的手機測試,沒有問題了。所以,現在認爲是因爲手機沒有 root。

5. java.lang.IllegalArgumentException: Failed to find configured root that contains xxx

時間:2019年3月22日22:11:46
錯誤日誌:

java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/9016-4EF8/Videos/20160129_200650.mp4
    at android.support.v4.content.FileProvider$SimplePathStrategy.null a(null)(FileProvider.java:183)
    at android.support.v4.content.FileProvider.null a(null)(FileProvider.java:4)
    at com.sdk.clean.video.VideoUtils.null a(null)(VideoUtils.java:53)
    at com.bat.clean.adapter.VideoResultAdapter$MediaViewHolder.null a(null)(VideoResultAdapter.java:10)
    at com.bat.clean.adapter.VideoResultAdapter$MediaViewHolder.null lambda$W8mSMnpQe-6pAYCNycyrYkg_zAw(null)(VideoResultAdapter.java:0)
    at com.bat.clean.a.-$$Lambda$k$b$W8mSMnpQe-6pAYCNycyrYkg_zAw.null onClick(null)(-.java:4)
    at android.view.View.null performClick(null)(View.java:6993)
    at android.view.View$PerformClick.null run(null)(View.java:26512)
    at android.os.Handler.null handleCallback(null)(Handler.java:790)
    at android.os.Handler.null dispatchMessage(null)(Handler.java:99)
    at android.os.Looper.null loop(null)(Looper.java:164)
    at android.app.ActivityThread.null main(null)(ActivityThread.java:7000)
    at java.lang.reflect.Method.null invoke(null)(Method.java)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.null run(null)(RuntimeInit.java:441)
    at com.android.internal.os.ZygoteInit.null main(null)(ZygoteInit.java:1408)

機型是8.1.0
問題分析:是在將外置 sd 卡上的視頻資源,發送給視頻播放器打開時,或則是圖片資源,發送給圖片打開器(圖庫)時出現的錯誤。其實內置 sd 卡上,是沒有問題的。代碼中已經通過 FileProvider 的形式來處理了,並且在 xml 文件夾下增加了 file_path.xml,如下:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path path="Android/data/com.bat.clean/" name="files_root" />
    <external-path path="." name="external_storage_root" />
</paths>

解決辦法:查詢 https://blog.csdn.net/fengyuzhengfan/article/details/52876586#commentsedit--,在 file_path.xml 中增加一個節點:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path path="Android/data/com.bat.clean/" name="files_root" />
    <external-path path="." name="external_storage_root" />
    <!--https://blog.csdn.net/fengyuzhengfan/article/details/52876586#commentsedit-->
    <root-path path="" name="video_photo_root" />
</paths>

文章作者能深入源碼找出解決辦法,很贊。

6. Java error: Comparison method violates its general contract

時間:2019年3月23日10:59:11
問題描述:

    private List<AppBean> mAppInfoList = new ArrayList<>();

    public void setPosition(int position, List<AppBean> appInfoList) {
        mPosition = position;
        mAppInfoList.clear();
        mAppInfoList.addAll(appInfoList);
        sortList(mAppInfoList, mPosition);
    }
    
    private void sortList(List<AppBean> appInfoList, final int position) {
        Collections.sort(appInfoList, (p1, p2) -> {
            if (position == POSITION_DATE) { // 按日期排序
                if (p1.getLastUpdateTime() > p2.getLastUpdateTime()) {
                    return 1;
                }
                if (p1.getLastUpdateTime() == p2.getLastUpdateTime()) {
                    return 0;
                }
                return -1;
            } else if (position == POSITION_SIZE) { // 按大小排序
                if (p1.getPkgSize() > p2.getPkgSize()) {
                    return 1;
                }
                if (p1.getPkgSize() == p2.getPkgSize()) {
                    return 0;
                }
                return -1;
            } else if (position == POSITION_NAME) { // 按名字首字母排序
                final String lhs = StringUtils.getFirstCharacter(p1.getAppName());
                final String rhs = StringUtils.getFirstCharacter(p2.getAppName());
                return lhs.compareTo(rhs);
            }
            return 0;
        });
    }

使用場景是在一個 Activity 裏,獲取到應用列表,在 Fragment 裏按照日期、大小、名字首字母進行排序。
在排序集合時出現的問題,暫時沒有解決辦法,也沒有復現。查詢了 https://stackoverflow.com/questions/19325256/java-lang-illegalargumentexception-comparison-method-violates-its-general-contr,也沒有復現問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章