2010年10月2日 星期六

Android 上的 Permissions

在撰寫 Android App 時,時常需要調用一些平台上的資訊,
例如使用 TelephonyManager 查詢 IEMI CODE 等需求,
就以取得 IMEI 為例,在 Android 中是使用 getDeviceId() 這個 API


public String getIMEI()
{
  final TelephonyManager telephonyManager = getTelephonyManager();
  if(telephonyManager == null)
  {
    return null;
  }
  final String imeiCode = telephonyManager.getDeviceId();
  return (imeiCode!=null)? imeiCode : "Android_Emulator";
}

private TelephonyManager getTelephonyManager()
{
  if(telephonyManager == null)
  {
    telephonyManager = (TelephonyManager)_service.getSystemService(Context.TELEPHONY_SERVICE);
  }
  return telephonyManager;
}


在一個空的 Android 專案中若這段 code 放在 try catch 中,
會發生跳到 catch block 的狀況,TRACE 後會發現是在 getDeviceID() 時發生錯誤,
這是因為部份 class 中的部份 method 在使用時必須擁有相關的權限,
試試在 Android Developers 中找到 TelephyManager,再找到 getDeviceId()

http://developer.android.com/reference/android/telephony/TelephonyManager.html


仔細看過後發現底下的確寫著:Requires Permission: READ_PHONE_STATE

再找找可以發現還有其他的特殊 method 需要用到特定的權限,
只要依照 Developers 上找到的資料,在專案中的 AndroidManifest.xml 加入即可,
舉例幾個常用的權限。


<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.BROADCAST_STICKY">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.VIBRATE"/>

沒有留言:

張貼留言