在 Android 平台上取得裝置資訊

最近作的東西必須要取得裝置上的一些資訊,但如果直接拿的話,一定會遇到錯誤訊息,大概會像下面這樣:




查了一下才知道,這是 Android 平台的安全機制作祟:任何會影響到其他程式、作業系統、或使用者操作的行為,都會被系統所管制,例如:讀取使用者自己的資料 (電話部或簡訊)、使用其他程式所建立的檔案、或執行網路的存取等。除非在安裝程式時有得到使用者的「許可」(permission) 才能操作;而這個所謂「得到使用者的許可」,就是要在程式的 AndroidManifest.xml 檔案中加入 uses-permission 的子元素,以說明這個程式在未來會用到哪些特殊的功能;如果使用者要安裝使用此程式的話,就必須同意程式未來的存取動作。而這些動作一但設定好,並安裝進手機上就不會再有所變動。

想知道有哪些動作是必須先經過設定 uses-permission 才能使用的,可以參照此網頁:
android.Manifest.permission
其中每一行都是原本我們不能使用,但可以改變其設定的操作,例如:
"android.permission.ACCESS_COARSE_LOCATION" - 能允許我們取得手機目前連線的ap位置,
"android.permission.READ_PHONE_STATE" - 可以讀取手機目前的狀態,
"android.permission.READ_SMS" - 可以讀取簡訊內容,
"android.permission.WRITE_CONTACTS" - 可以寫入電話簿內容,但無法讀取。
(注意!上述最後兩項設定都只有設定「讀取」與「寫入」動作而已,若你的程式對這些資料同時有「讀」和「寫」的需求時,就必須個別設定!)

以下是讀取一些手機資訊的範例:


public class InfoRetriever extends Activity {

  private TextView locationText;
  private TextView numberText;
  private TextView simText;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //以下建立會用到的圖形元件
    LinearLayout layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.VERTICAL);
    layout.addView(locationText = new TextView(this));
    layout.addView(numberText = new TextView(this));
    layout.addView(simText = new TextView(this));
    setContentView(layout);

    //如果沒有設定 "android.permission.READ_PHONE_STATE", 那麼以下這行就會發生錯誤
    TelephonyManager manager = (TelephonyManager) InfoRetriever.this.getSystemService(Context.TELEPHONY_SERVICE);

    //同理, 為了取得cell資訊, "ACCESS_COARSE_LOCATION"的設定也是必要的
    GsmCellLocation location = (GsmCellLocation) manager.getCellLocation();
    locationText.setText(location.toString());

    String number = manager.getLine1Number();
    numberText.setText(number);
    String sim = manager.getSimSerialNumber();
    simText.setText(sim);
  }
}

留言

這個網誌中的熱門文章

PHP:callback函數的使用

PHP:變數範圍

PHP常用函數:陣列(array)