Category: Android 教學

Android marshmallow Runtime Permissions

Dangerous permissions need to be granted explicitly

1
2
3
4
5
6
7
8
9
Activity.this.requestPermissions(new String[]
{
Manifest.permission.RECORD_AUDIO
,Manifest.permission.READ_CONTACTS
,Manifest.permission.WRITE_CONTACTS
,Manifest.permission.READ_EXTERNAL_STORAGE
,Manifest.permission.WRITE_EXTERNAL_STORAGE
}
,REQUEST_PERMISSION);

Table 1. Dangerous permissions and permission groups.

Permission Group Permissions
CALENDAR
CAMERA
CONTACTS
LOCATION
MICROPHONE
PHONE
SENSORS
SMS
STORAGE

Defining and Enforcing Permissions

Tags :

Handy adb commends for Android

list devices

1
adb devices

install & uninstall apk

1
2
adb install -r ~/Download/myapk.apk
adb uninstall com.ynjan.myapp

start an activity

1
2
adb shell am start com.ynjan.myapp/.MainActivity
adb shell am start com.ynjan.myapp/com.ynjan.myapp.MainActivity

list installed packages

1
adb shell pm list packages -f

reboot

1
adb reboot

enter devices’s shell

1
adb shell

make input in shell

1
2
3
4
5
6
7
usage: input ... 
   input text <string> [delay]
   input keyevent <key code number or name>
   input [touchscreen|touchpad] tap <x> <y>
   input [touchscreen|touchpad] swipe <x1> <y1> <x2> <y2>
   input trackball press
   input trackball roll <dx> <dy>

for example

1
2
3
4
#unlock screen
input keyevent 82
#device power on/off
input keyevent 26

android key codes

clear application data

1
adb shell pm clear com.ynjan.myapp

Logging

1
2
3
4
5
6
7
8
9
# log with tag
adb logcat -s TAG_NAME_1
# log with priority
adb logcat "*:PRIORITY"
adb logcat -s TAG_NAME:PRIORITY
# log with keyword (regex)
adb logcat | grep "SOME_KEYWORDS"
# clear log
adb logcat -c
Tags : , ,

[教學] 取得 android unique device id 的方法

目前取得 android unique device id 的方法有下面四種

  • ANDROID_ID
  • WiFi Address
  • Bluetooth Address
  • IMEI

1. ANDROID_ID

缺點:

  • 其值可能是 null:Android  2.2 (“Froyo”) 之前裝置可能不支援。
  • 可能會有相同的ANDROID_ID:山寨手機
  • factory reset 後,值會改變

權限:無

取得方式:

String androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);

 

2. WiFi Address

缺點:

  • 裝置必需要有 WiFi 功能
  • 其值可能是 null:WiFi 需要開啓

權限:android.permission.ACCESS_WIFI_STATE

取得方式:

WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
 
String wifiMac = wm.getConnectionInfo().getMacAddress();

 

3. Bluetooth Address

缺點:

  • 裝置必須有 Bluetooth 功能

權限:android.permission.BLUETOOTH permission

取得方式:

String btMac = BluetoothAdapter.getDefaultAdapter().getAddress();

 

4. IMEI

缺點:

  • 裝置必須有打電話功能

權限:android.permission.READ_PHONE_STATE

取得方式:

TelephonyManager thManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
 
String imei = thManager.getDeviceId();
Tags : ,

[教學] Google Cloud Messaging (GCM) Service 訊息推播

事前準備

  • Google API project。需要新增 Project 及  API Key。
  • 推播 Server。需要一個推播 Server 發送推播訊息。
  • gcm.jargoogle 所提供的相關 library。

推播訊息格式

如果你是使用 google 提供的 sdk,那他已經把相關格式包裝好了,不需要去理會格式。

如果想只到完整格式內容可參考 gcm#request

新增一個 Google API project

透過下面的步驟你會得到

  1. Sender ID,client 端用來註冊得到 Registeration ID
  2. API Key,server 端用來發送訊息

步驟很簡單,請參考 GCM Document

安裝 gcm.jar

在 Eclipse 內,開啓 Android SDK Manager

安裝 Extras > Google Cloud Messaging for Android Library,所下載的檔案會放置在

YOUR_SDK_ROOT/extras/google/gcm

「註」如果沒有看到安裝選項,

  1. 請先更新 Android SDK Manage > Tools > SDK Manager (rev. 20)
  2. Help > Install New Software > Android Developer Toolkit ADT

APP 端設定

請參考 Writting the Android Application

這邊會需要用到上面所申請到的 SENDER_ID 去註冊一組 REGISTERATION_ID,然後把這個 REGISTERATION_ID 上傳至 Server 用來作為辨識該處裝置的 ID。

註冊

String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
   GCMRegistrar.register(this, SENDER_ID);
}
ServerUtilities.register(context, regId);

接收提醒

相較於 apple 將提醒功能由底層自動處理掉節省不少步驟,android 則是透過 GCMIntentServiceonMessage(Context context, Intent intent) 讓開發者自行編輯提醒內容

protected void onMessage(Context context, Intent intent) {
   // 這裡提取的 message, 主要是server端 addData時所帶入的部份
   String message = intent.getStringExtra("message");
   displayMessage(context, message);
   // notifies user
   generateNotification(context, message);
};

Server端範例

請參考 Writting the Android Server-side Application

這邊會用到先前所申請到的 API_KEY 用來作為與 google server 溝通時的 key。

// 產生一個 sender instance
Sender sender = new Sender(API_KEY);
Message message = new Message.Builder().addData("message", "Hello World!").build();
// 發送訊息到 device
sender.send(message, REGISTERATION_ID, 5);

相關文章

Tags : , ,