2011年11月3日 星期四

[Android] SecurityException: Neither user 10043 nor current process has android.permission.READ_PROFILE.

Error Message

FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{.ContactProfileTestActivity}: java.lang.SecurityException: Neither user 10043 nor current process has android.permission.READ_PROFILE.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
at android.app.ActivityThread.access$600(ActivityThread.java:122)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4340)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.SecurityException: Neither user 10043 nor current process has android.permission.READ_PROFILE.
at android.os.Parcel.readException(Parcel.java:1327)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:181)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:358)
at android.content.ContentResolver.query(ContentResolver.java:304)
at com.yellow.contact.ContactProfileTestActivity.getProfile(ContactProfileTestActivity.java:30)
at com.yellow.contact.ContactProfileTestActivity.onCreate(ContactProfileTestActivity.java:24)
at android.app.Activity.performCreate(Activity.java:4465)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
... 11 more


Occurred when query ME profile...

2011年11月1日 星期二

[Java] Abstract Class Purpose

abstract 就是不允許被 new 出來直接用的東西。


[Android] Start Activity in Service or Content Provider

* 可以在 Service 或 Content Provider 中開啟 Activity,但 Intent 中必須加入 Intent.FLAG_ACTIVITY_NEW_TASK Flag 才行,否則會出現以下錯誤。


* In Service
   ......
java.lang.RuntimeException: Unable to start service com.yellow.android.service.EmptyService@444bde30 with Intent { cmp=TestService}: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
   ......
Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
at android.app.ApplicationContext.startActivity(ApplicationContext.java:560)
   ......


* In Content Provider
   ......
android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
at android.app.ApplicationContext.startActivity(ApplicationContext.java:560)
   ......


* Pending Issues
  • Why must sartActivity with new task?
  • Different tasks in an application will have any effects?


Related

2011年10月30日 星期日

[Android] A glance at Android 4.0 features.

* 在 android 4.0 主要是整合了手機與平板上的開發,因此在 4.0 中,在 UI 上可以看融合了 3.0 的設計。


* 在幾篇文章介紹中,認為主要改變可分為:
  • UI: 加入了 tablet 上的元素
    • Lasted Recently Used - LRU 的顯示方與 3.0 相同,是縮圖。
    • Resize widget - 可直接改變桌面上 widget 的大小。(Supported in Android 3.1)
    • Quick Unlock/incoming Call - 有螢幕鎖時來電,可直接選擇接/不接/以簡訊回覆。
    • Action Bar - Home 底下新增個常用 app 的 action bar。(Supported in Android 3.0)
  • User behaviour and new functions: 對於 user 使用習慣加強與新增功能
    • New
      • App Management - 可直接從 app 選擇要對它的操作,ex: 捷徑、解安裝...。
      • Folder in Home - 在桌面上,可直接拉 app 疊在一起,即是變成是在同一個資料中。
      • Face detection - 臉部偵測,可用於解鎖。
      • Data Usage - (new) 可看到手機網路資訊傳輸量統計;可設定 threshold 通知。
      • Blue Health Devices - for 健康管理功能。
      • Accessibility - 輔助視障用戶操作。
    • Enhance
      • Notification - 可在不解鎖的狀況下查看; 用 swipe 方式關閉通知...。
      • Browser - 可開 16 個 tab、Sync bookmarks with Chrome...
      • Input - 在輸入時可做拼字檢查。
      • Calendar(read/write) - 可對 google calendar 做更多操作。
      • Camera - 快速拍照、全景拍攝、編輯圖片....。
      • Photo(Gallery)
  • Share(Social Activities): 結合社群功能
    • Contact(ME, status update...) - 新增 "ME" profile;與 facebook 等社群訊息整合。
    • Android Beam(NFC) - 利用 NFC 新增此功能,讓兩台 device 能更容易的分享。


以上不是所有功能,詳細內容可參考以下 references。


* Reference
- Android4.0 SDK新功能详解 ****
- Galaxy Nexus 和 Android Ice Cream Sandwich 報導大集合
- Android 4.0 Ice Cream Sandwich 正式發表!
- Android 4.0 發表 新功能、新介面搶先看 ***
- Android 4.0 (Ice Cream Sandwich)正式發表, 主要新功能簡介 - 小丰子俱樂部 - Yahoo!奇摩部落格 **
- Samsung Galaxy Nexus / Google Android ICS 發表會重點整理
- Android 4.0的那些新玩意們 **
- Android 4.0 Platform  ****

[Android] Unable to find a 'userdata.img' file for ABI armeabi to copy into the AVD folder

Error Message

Unable to find a 'userdata.img' file for ABI armeabi to copy into the AVD folder

發生在當想要啟動 android 4.0 的 AVD


Solution

Android 4.0 必須要安裝 ARM EABI v7a System Image 才能啟動



* Reference
- Android 4.0:Unable to find a 'userdata.img' file for ABI armeabi to copy into the AVD folder. - 懒人工作室 - 博客频道 - CSDN.NET
- How to create a AVD for android 4.0 - Stack Overflow

[Android] Application does not specify an API level requirement

Error Message

WARNING: Application does not specify an API level requirement!

會發生在 Run Android Application on eclipse
是否在 project 中少指定了什麼?

[Android] SyncException: Too many open files

Error Message

com.android.ddmlib.SyncException: Too many open files

Switch DEBUG USB off and on again. It works for me. It seems to be some sort of problem with USB sync when debuggin in my device.

Essentially, that means you have a memory problem. More than likely it is a leak.

First restart your phone and verify you are still getting the error. If so you are going to need to start digging in your code and find out where you are leaking!

Need more help? Post some code!


尚不知道在什麼情況下會發生


[AndroidDev] Live Wallpaper

  • Very similar to a Service.
  • The only difference is the addition of a new method, onCreateEngine(), whose goal is to create a WallpaperService.Engine.

WallpaperService.Engine
  • The engine is responsible for handling the lifecycle and drawing of a wallpaper.
  • The system provides a surface on which you can draw, just like you would with a SurfaceView.
  • The engine can also implement several methods to interact with the user or the home application.

Performance
  • The most important part of the lifecycle of a wallpaper is when it becomes visible, as indicated by a call to onVisibilityChanged().
  • When invisible, such as when the user launches an application that covers the home screen, a wallpaper must stop all activity.
  • 所以必須優化繪圖的內容及管理好 wallpaper 的 lifecycle,以達到以下改善:
    • To avoid using too much CPU.
    • Survive the battery life.
    • To avoid slowing down the rest of the system.

Configurations
  • <uses-sdk android:minSdkVersion="7" />
    • which indicates to Android Market and the platform that your application requires Android 2.1 or higher.
  • <uses-feature android:name="android.software.live_wallpaper" />


Pending Study
  • Draw content for wallpaper. 


* Reference 
- Live Wallpapers | Android Developers

[Encode] UTF-8 = 65001

UTF-8's codepage is 65001


Brief decription
在非Unicode環境下,由於不同國家和地區採用的字符集不一致,很可能出現無法正常顯示所有字元的情況。微軟公司使用了內碼表(Codepage)轉換表的技術來過渡性的部分解決這一問題,即透過指定的轉換表將非Unicode的字元編碼轉換為同一字元對應的系統內部使用的Unicode編碼。



* Reference
- Unicode

[Android] conversion to dalvik format to error 1

Error Message

conversion to dalvik format to error 1

Occurred when export apk file


Solution

proguard.bat

android 提供 proguard.bat 這個工具 讓你在 export apk 時 能對你的 code 做混淆的步驟

但在 SDK Tool, r12 會出現此問題,在 r11 還並不會有這問題。

在推出 android 4.0 後的 r14 仍然沒有修復此問題。

解決此問題的方法是修改以下這個檔案:

(#Android SDK Path)\tools\proguard\bin\proguard.bat, 將

call %java_exe% -jar "%PROGUARD_HOME%"\lib\proguard.jar %*

改為

call %java_exe% -jar "%PROGUARD_HOME%"\lib\proguard.jar %1 %2 %3 %4 %5 %6 %7 %8 %9

import jar

import JAR 檔時 有可能 reference 了兩次 JAR 檔

可確認 Java Build Path > LibrariesAndroid > Library


* Reference
- 在android中使用proguard混淆代码出现“Conversion to Dalvik format failed with error 1”错误的解决方法 - Naivesoft - 博客频道 - CSDN.NET
android - "Conversion to Dalvik format failed with error 1" on external Jar - Stack Overflow

[Android] NotFoundException: String resource ID

Error Message
Uncaught handler: thread main exiting due to uncaught exception
android.content.res.Resources$NotFoundException: String resource ID #0x0
 at android.content.res.Resources.getText(Resources.java:200)
 at android.widget.TextView.setText(TextView.java:2822)



Solution

因為 TextView.setText() 中可傳入 CharSequence text or int resId

因此若想顯示數字 而直接這樣寫 TextView.setText(121)

那麼會被識為要對應的是 string resource id 為 121 的字串內容

而跑出這個 exception

[Android] CalledFromWrongThreadException

Error Message
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
at java.lang.Thread.run(Thread.java:1102)
Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRoot.checkThread(ViewRoot.java:2705)
at android.view.ViewRoot.invalidateChild(ViewRoot.java:574)
at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:600)
at android.view.ViewGroup.invalidateChild(ViewGroup.java:2450)
at android.view.View.invalidate(View.java:4945)
at android.widget.TextView.checkForRelayout(TextView.java:5442)
at android.widget.TextView.setText(TextView.java:2693)
at android.widget.TextView.setText(TextView.java:2561)
at android.widget.TextView.setText(TextView.java:2536)
at com.yellow.android.TextActivity$1.onProgressUpdate(TextActivity.java:40)
at com.yellow.android.TextActivity$1.doInBackground(TextActivity.java:32)
at com.yellow.android.TextActivity$1.doInBackground(TextActivity.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
 ... 4 more



Solution

Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

一般是因為沒有在 UI thread 執行關於 UI 上的操作 所以會利用 AsyncTask

原以為是因為在 AsyncTask 中使用 Thread.sleep() 而發生的 exception

但重寫後並不是

所以目前不確定發生的情況與真正原因


2011年10月29日 星期六

[Android] No active admin owned by uid

Error Message

java.lang.SecurityException: No active admin owned by uid 10028 for policy #3

Occurred when using DevicePolicyManager


Solution

Need to register a DeviceAdminReceiver before you can use the device policy manager


* Reference
- Implementing screen lock in Android 2.0 - Stack Overflow
- Android Developer Device Admin Guide
- 请问如何调用锁屏? - Android 问题&解答 - eoe·Android开发者门户 - Powered by Discuz!

[Android] 螢幕保護

Want To

就像電腦的螢幕保護程式,當手機閒置一段時間,不會鎖螢幕或是螢幕暗下來

而是顯示我們想要的內容,例如輪播照片之類的


Try To

[Lock Screen/Keyguard]
  • 取代系統原有的 Lock Screen/Keyguard
    • May Relative API
      • DevicePolicyManager
      • KeyguardManager
      • WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED, WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
    • Issues:
      • What is the different between Lock Screen and Keyguard means?
      • Keyguard includes 螢幕鎖和圖案解鎖等。(refer. 1)
      • Many events should be considered, ex:
        • Screen off/on, Incoming call/SMS, Alert Message.....
      • 是否可以在原有的 Lock Screen/Keyguard 上再執行自己的 application?
  • Disable Lock Screen/Keyguard and using Service or Thread to record touch event. 如果事件間隔超過設定,則啟動 Activity。
    • Events handler problems.
    • Start Activity in Service is allowed?
// Using KeyguardManager can disable/re-enable keyguard
KeyguardManager mKeyguardManager = (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE); 
KeyguardLock mKeyguardLock = mKeyguardManager.newKeyguardLock("Activity1"); 
mKeyguardLock.disableKeyguard(); 



[Live Wallpaper]
  • Live wallpaper still showing when screen is locked,所以若是僅顯示在螢幕鎖之下即可...
    • 動態設定 live wallpaper,也就是當螢幕鎖了,才設定(因為應該要不影響 user 原有的桌步設定),取消後恢復 user 原有設定。
    • 但沒有正式官方的相官 method。


* Reference
  1. android的KeyGuard_谢彦_新浪博客
  2. [Android]替换系统的Lock Screen - sunny09290的专栏 - 博客频道 - CSDN.NET
  3. Handling Screen OFF and Screen ON Intents

2011年10月20日 星期四

[Android] Is network available?

Error Message

Occurred on Desire API 2.2

當關閉行動網路時,透過以下的方法判斷是否有網路,卻回傳 true?!

public static boolean isNetworkAvailable(Context context) {  
    ConnectivityManager connectivity = (ConnectivityManager) context  
        .getSystemService(Context.CONNECTIVITY_SERVICE);  
        if (connectivity == null) {  
        } else {  
            NetworkInfo[] info = connectivity.getAllNetworkInfo();  
            if (info != null) {  
                for (int i = 0; i < info.length; i++) {  
                    if (info[i].getState() == NetworkInfo.State.CONNECTED) {  
                        return true;  
                    }  
                }  
            }  
        }  
        return false;  
    }  

若使用飛安模式則是回傳 false,但此情況僅出現幾次, 之後則模擬不出來,所以是否有疑漏其他操作行為?


Solution

在 API 2.1, 2.2, 2.3.3 的手機上測以下三種模式下所對應的結果:

飛安模式
  • NetworkInfo: [Landroid.net.NetworkInfo;@xxxxx, 
  • activeInfo: null 
  • type: MOBILE, state: DISCONNECTED, detailed state: DISCONNECTED, isAvailable: false, isConnected: false 
  • 其他 type 的 values 皆為以下 
    • state: UNKNOWN, detailed state: IDLE, isAvailable: false, isConnected: false 


開啟行動網路 
  • NetworkInfo: [Landroid.net.NetworkInfo;@xxxx, 
  •  activeInfo: NetworkInfo: type: MOBILE[UMTS], state: CONNECTED/CONNECTED, reason: dataEnabled, extra: internet, roaming: false, failover: false, isAvailable: true 
  • type: MOBILE, state: CONNECTED, detailed state: CONNECTED, isAvailable: true 
  • 其他 type 的 values 則為以下 
    • state: UNKNOWN or DISCONNECTED, detailed state: IDLE/DISCONNECTED/CONNECTED, isAvailable: true(few types are true), isConnected: false(few types are true) 


關閉行動網路 
  • NetworkInfo: [Landroid.net.NetworkInfo;@444b0530, 
  • activeInfo: null 
  • type: MOBILE, state: DISCONNECTED, detailed state: DISCONNECTED, isAvailable: true, isConnected: false 
  • 其他 type 的 values 皆為以下
    • state: UNKNOWN/DISCONNECTED, detailed state: IDLE/DISCONNECTED, isAvailable: true(few types are false), isConnected: false 


所以 state 結果應該和我們的需求一致 ,因此猜測是否得到的是狀態正在轉換時的值,試著監聽網路狀態的改變,以下方式能得到和操作一致的結果,但不確定此種方式是否正確。
// briefly
TelephonyManager.listen(new PhoneStateListener() { 
    @Override  
    public void onDataConnectionStateChanged(int state) {  
        switch(state){  
            case TelephonyManager.DATA_DISCONNECTED:
                break;  
            case TelephonyManager.DATA_CONNECTING:
                break;  
            case TelephonyManager.DATA_CONNECTED: 
                break;  
        }  
    }                     
}, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);  

另一種則是 onReceiver action "android.net.conn.CONNECTIVITY_CHANGE" 
但在改變任何狀態時皆收不到相關的 action!!!?


Pending Issues
監聽網路狀態 Using receiver to listen action "android.net.conn.CONNECTIVITY_CHANGE"


* Reference
- Android – 判斷手機是否連上網路 (ConnectivityManager)
- network: android 网络判断 **
- android之ConnectivityManager简介,网络连接状态
- NetworkInfo - ConnectivityManager
- 网络连接状态的监听和判断(android,wifi,Gprs)
- Android判断网络状态方法详解
- 监听手机的网络连接状态