1. 程式人生 > >Android程式碼報錯彙總

Android程式碼報錯彙總

本帖子是個人開發中遇到的錯誤,會在此處做一個記錄,會持續更新。

1. 匯入依賴時,有時會報錯(類似下列錯誤)

More than one file was found with OS independent path ‘META-INF/DEPENDENCIES’

解決方式:
在build.gradle 中 新增下列程式碼(根據個人情況自行修改):

packagingOptions {  
        exclude 'META-INF/DEPENDENCIES'  
        exclude 'META-INF/LICENSE'  
        exclude 'META-INF/LICENSE.txt'  
        exclude 'META-INF/license.txt'  
        exclude 'META-INF/NOTICE'  
        exclude 'META-INF/NOTICE.txt'  
        exclude 'META-INF/notice.txt'  
        exclude 'META-INF/ASL2.0'  
    }  

2. WebView載入過程中 對於Https 資源的載入問題。 可能會出現 https 相關的圖片無法顯示、 或者 相關的css 樣檔案無法顯示等

重寫webViewClient的以下方法即解決

@Override  
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){  
        handler.proceed();  
}  

3. DexArchiveMergerException: Unable to merge dex
這個錯誤,困擾了我幾個小時,在網上看了好多部落格,有刪除.gradle 然後 clean的, 也有其他的,但多半不能解決問題。 我這邊是通過 檢測重複的依賴,或者重複的包 解決的。

檢測一下是否匯入了重複的依賴 或則 jar包

4.AES 加密中 AES/CBC/NoPadding 情況下, 當不足 16位元組 或者 16 * n 個位元組的情況下, 會導致加密失敗 即 null 。我們可以對不足部分進行 補充, 可以是不可見字元 , 或者… 自己定義吧。當然,解密的過程也會出現不可見字元, 這個自己處理一下便可以了

  /**
     *  使用 noPadding 加密 不足16位部分 使用 0x00 不可見字元填充
     * @param beforeStr
     * @return
     */
    private static String processString(String beforeStr) {
        if (beforeStr == null)return null;
        int length = beforeStr.getBytes().length;
        int otherLength = 16 - length % 16;
        byte[] bytes = beforeStr.getBytes();
        byte[] newBytes = new byte[length + otherLength];
        for (int i = 0; i < newBytes.length; i++) {
            if (i < length){
                newBytes[i] = bytes[i];
            }else {
                newBytes[i] = 0x00;
            }
        }
        return new String(newBytes);
    }

5. 關於Gson解析異常:Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $

檢測json 字串,亂碼 或者 包含空格、 不可見字元等。都會導致解析失敗。

6. 遇到 release 版本與 debug 版本表現不一樣的情況下, 如果你的專案裡面有混淆,八成是混淆程式碼部分出了問題 。檢測表現不同或者是奔潰的地方,找到對於的 類或者 程式碼 塊, 看是否在混淆檔案裡面進行的處理。(因為半信半疑的想法,在這個不起眼的小問題上面浪費了 數個小時)

7.報錯: 無法儲存裁剪過的圖片
對於呼叫系統裁剪的程式碼中由以下這樣一行

intent.putExtra(MediaStore.EXTRA_OUTPUT, uri1);

這行程式碼的意思是將圖片儲存到 我們所提供的uri1 中。
android4.4以下,可以正常, 4.4以上 當uri 是 應用內目錄就會有這樣的問題。等於是 一個應用要往另外一個應用儲存資料,這顯然是不被允許的。
解決方式:
1.刪除該行。
2.intent.putExtra(“return-data”, true);
3.在onActivityResult 的回撥中

Bitmap bitmap = data.getParcelableExtra("data"); 

來獲取圖片,然後就可以做我們想做的操作了。

Parcelable 報錯

Unmarshalling unknown type code 3670065 at offset 724

出現這樣的錯誤時因為序列化和反序列話的順序不一致導致的

Gradle 報錯 unable to Merge dex

目前預測 兩個原因:
1. 添加了重複的依賴 或者 jar 包 會報這個錯。
2. 方法數越界 65535問題。 可以在gradle Console 中 run -info 檢視詳細的報錯資訊。

WebView 定位問題

需要新增如下程式碼,即可定位:

//webview定位相關設定
settings.setDomStorageEnabled(true);
settings.setGeolocationEnabled(true); 
//settings.setGeolocationDatabasePath(getFilesDir().getPath());
progressWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onGeolocationPermissionsShowPrompt(String origin, Callback callback) {
    callback.invoke(origin, true, true);
    super.onGeolocationPermissionsShowPrompt(origin, callback);
}
});