顯示具有 Exception 標籤的文章。 顯示所有文章
顯示具有 Exception 標籤的文章。 顯示所有文章

2016年1月21日 星期四

Android 實戰記錄 (21) - multiDexEnabled 造成的 NoClassDefFoundError 問題

因為啟用了multiDexEnabled之後
反而在特定的手機(ASUS),出現了 NoClassDefFoundError 問題

瞭解之前版本與之後版本差異就差在我因為加了
multiDexEnabled

因為加入了
compile 'org.apache.commons:commons-lang3:3.4'
的關係

超過了65K method

後來終於解決問題,是查看了
以下這篇文章
Building Apps with Over 65K Methods
https://developer.android.com/intl/zh-tw/tools/building/multidex.html

調整了一些gradle的設定

啟用了(應該是改下面幾個設定就可以了)
dependencies {
    compile 'com.android.support:multidex:1.0.0'}


buildToolsVersion "21.1.0"

defaultConfig {
    multiDexEnabled true}

然後改寫原本繼承的Application
https://developer.android.com/intl/zh-tw/reference/android/support/multidex/MultiDexApplication.html

複寫方法
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}

則可以解決問題。
ASUS,就可以運行正常。

2015年12月17日 星期四

Android 實戰記錄 (13) - Android 6.0 權限問題

今天為了處理簡訊讀取問題
開一個新的專案來處理測試

我的手機是Android 6.0
開發專案是targetSdkVersion是23
意外就剛好遇到6.0之後的權限問題

根據以下專業的文章說明
http://inthecheesefactory.com/blog/things-you-need-to-know-about-android-m-permission-developer-edition/en

取得以下資訊
 In Android 6.0 Marshmallow, application will not be granted any permission at installation time. Instead, application has to ask user for a permission one-by-one at runtime.

Anyway this new Runtime Permission will work like described only when we set the application'stargetSdkVersion to 23 which mean it is declared that application has already been tested on API Level 23. And this feature will work only on Android 6.0 Marshmallow. The same app will run with same old behavior on pre-Marshmallow device.

很不湊巧如果使用的是targetSdkVersion 23的話,

過去的權限方式,將會出問題。

加AndroidMainfest.xml不一定能解決問題。

因為我剛好使用的是開發模式,直接Builder進手機,
然後就直接出問題。
可能沒有直接授權的關係。

需要到「設定」→「應用程式」→權限,變更權限後,

這種問題就能夠被解決。(在開發方面的問題)
就不會在開發時,一直卡關在「java.lang.SecurityException」這個問題上

2015年12月10日 星期四

Android 實戰記錄 (9) - Java.lang.SecurityException: GetDeviceId


http://openstackwiki.org/wiki/Java.lang.SecurityException:_GetDeviceId:_weder_Benutzerprozess_10058_noch_aktuelle_hat_android.permission.READ_PHONE_STATE

我的手機是Nexus 5 ,從5.x版升級到6.0版後,
在使用Android Studio deubg 開發 裝到手機時,開啟App卻發生了Exception

才發現,原本的APP竟然沒有加上
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

但從google play 下載,並不會發生錯誤,
只有用Android Studio Debug 模式裝進去的會發生。

不知道是怎麼一回事,總之有這個問題。
發生的程式錯誤在以下程式
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
String deviceID = tm.getDeviceId();


2015年12月7日 星期一

Android 實戰記錄 (8) - 製造SocketTimeoutException

要判斷Android本身手機的網路問題,或他的網路環境問題,或Server端的網路問題。

因為要判定是誰的問題,會很困難。

今天要有一個公正的第三方,Google,若使用者連Google可行,則表示User的網路沒問題
這時Server端出現的問題會有
SocketTimeoutException
ConnectTimeoutException
UnknownHostException

當經由網路DNS找不到Host,可能是,我們Server完全無法找到,或則對方的網路是封閉連不出去,就會是UnknownHostException

但Server找得到,但完全無法連上產生Socket,接口沒對到(就是電話互打,沒接通)
就會產生SocketTimeoutException問題

若是講話講太久被斷線,才是ConnectTimeoutException問題

但問題是,我要如何產生SocketTimeoutException問題,
想到一個方法,
就是連到正確的網站,但不未提供服務的port
如http://wwww.abc.com:8088
這樣就可以產生SocketTimeoutException問題,以便測試程式可否正確執行


2015年12月2日 星期三

Android 實戰記錄 (6) - finished with non-zero exit value 2

解決方法如下:
http://stackoverflow.com/questions/33296786/error-finished-with-non-zero-exit-value2

http://developer.android.com/intl/zh-tw/tools/building/multidex.html

    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 21
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }

2015年11月29日 星期日

Android 實戰記錄 (4) - java.lang.NoSuchMethodError: android.widget.Button.setBackground

參考網址:
http://stackoverflow.com/questions/18559248/button-setbackgrounddrawable-background-throws-nosuchmethoderror

今天發生
java.lang.NoSuchMethodError: android.widget.Button.setBackground

主要原因為
Android 版本在 4.0.3
為小於 API 16

無法使用Button的setBackground
需改寫為
setBackgroundResource

2015年11月26日 星期四

Android 實戰記錄 (3) - OutOfMemory 引發問題原因

目前我所負責的APP的 OutOfMemory 引發問題原因有以下三點

1.  ImageView設定圖檔太大,加上使用BitmapFactory.decodeResource
   備註:遇到機型幾乎是「三星 Galaxy Note II」Android 4.4.2版,不知道是不是哪個使用者,非常無法接受很大的圖示處理。
2. android.view.InflateException: Binary XML file line ,主要XML裡有比較暫量的圖檔
3. 會發生在,呼叫完API,由於API文字過多所造成
java.lang.OutOfMemoryError
 at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94)
 at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145)
 at java.lang.StringBuilder.append(StringBuilder.java:216)

目前大致發生在這些問題上
第一個解決容易。
第二、三就不確定實際解法

2015年11月23日 星期一

Android 實戰記錄 (2) - ArrayAdapter - java.lang.IndexOutOfBoundsException: Invalid index

從錯誤訊息發現了這一個問題

我有使用一個ArrayList<T>的連結串列,

假設他的變數叫mList

在初始化的時候會
mList = new ArrayList<T>();

一般只會
mList.clear();
mList.addAll();
mList.get();

就沒有其它使用指派的指令。

懷疑,可能的原因在
未替ArrayAdapter設定getCount的動作,可能會影響到。

所以加入了,做特殊處理,避免發生問題。

@Overridepublic int getCount() {
   if(result!=null) {
      return result.size();
   } else {
      return 0;
   }
}

2015年11月22日 星期日

Android 實戰記錄 (1) - java.lang.OutOfMemoryError


這次遇到OutOfMemory  問題

可能原因在於導覽頁或說明頁,跳出滿版的圖片
而圖片大小是1080X1920,約10幾K才會
但經過decode成Bitmap後,可能就變成不止10幾K

原使用以下方式取得後再設定
Bitmap bmp = BitmapFactory.decodeResource(res,rid);
imageView.setImageBitmap(bmp );

但若用另一種方式
imageView.setImageResource(rid);

一樣會耗大量的記憶體處理
根據以下方式處理
http://givemepass.blogspot.tw/2011/11/blog-post_16.html

  1. 使用 BitmapFactory.decodeStream() 產生Bitmap
  2. 設定 BitmapFactory.Options inSampleSize,
         (inSampleSize值越大解析度越小,佔用memory也越小)
  3.  onPause/onStop/onDestory 時,將沒用到的Bitmap release(用recyle())


實作了之後,發現,記憶體初始佔量變小,
有20MB以上的差異效果。

可能在各種記憶體控管上(由其使用大圖)
需多注意,可能拉高記憶體,就容易發生之後的OutOfMemory問題。
可盡量的避免這樣的問題

其它參考網頁:
http://blog.xuite.net/ffc99a3b/ooxx/44391740-%5B%E8%BD%89%E8%BC%89%5D+Android+Out+Of+Memory(OOM)+%E7%9A%84%E8%A9%B3%E7%B4%B0%E7%A0%94%E7%A9%B6

------------
實作程式:
Bitmap bmp = getLocalBitmap(ctx,rid);

public Bitmap getLocalBitmap(Context ctx, int rid){
   InputStream inputStream = ctx.getResources().openRawResource(rid);
   return BitmapFactory.decodeStream(inputStream, null, getBitmapOptions(1));
}

public BitmapFactory.Options getBitmapOptions(int scale){
   BitmapFactory.Options options = new BitmapFactory.Options();
   options.inPurgeable = true;
   options.inInputShareable = true;
   options.inSampleSize = scale;
   return options;
}

---------------------------

也有其它OutOfMemory的錯誤訊息的顯示錯誤內容如下

Caused by: java.lang.OutOfMemoryError: Failed to allocate a 10240012 byte allocation with 9727265 free bytes and 9MB until OOM

java.lang.OutOfMemoryError: Failed to allocate a 4194316 byte allocation with 3346926 free bytes and 3MB until OOM

java.lang.OutOfMemoryError: (Heap Size=98304KB, Allocated=90289KB)