分類
Uncategorized

使用 RingtoneManager 播放提示音(NOTIFICATION),鬧鐘(ALARM),來電鈴聲(RINGTONE)

1.播放預設的提示音

 public static void playDefaultNotification(Context context) {
    Uri defaultNotificationURI = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    Ringtone soundOfDefaultNotification = RingtoneManager.getRingtone(context, defaultNotificationURI);
    soundOfDefaultNotification.play();
  }

其中RingtoneManager.TYPE_NOTIFICATION為提示音的設定。
若想播放預設的鬧鐘只要改為RingtoneManager.TYPE_ALARM
播放預設的鬧鐘只要改為RingtoneManager.TYPE_RINGTONE
2.播放裝置內其他的提示音
2-1.首先取得裝置內的提示音清單

 public static Map<String, String> getSoundTitleAndUri(Context context, int type) {
    RingtoneManager manager = new RingtoneManager(context);
    manager.setType(type);
    Cursor cursor = manager.getCursor();
    Map<String, String> titleAndUri = new HashMap<>();
    while (cursor.moveToNext()) {
      String title = cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX);
      String id = cursor.getString(RingtoneManager.ID_COLUMN_INDEX);
      String uri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX);
      titleAndUri.put(title, uri+"/"+id);
    }
    return titleAndUri;
  }

使用的方式如下(取得提示音的清單)

getSoundTitleAndUri(context, RingtoneManager.TYPE_NOTIFICATION);

回傳的Map其key值即為提示音的名稱,value值為提示音的Uri。
若想取得的是鬧鐘清單,只要改為RingtoneManager.TYPE_ALARM即可
若想取得的是來電鈴聲清單,只要改為RingtoneManager.TYPE_RINGTONE即可
若把該Map印出來如下。

key:Alloy value:content://media/internal/audio/media/89
key:Arc value:content://media/internal/audio/media/90
key:Bezel value:content://media/internal/audio/media/91
...

Alloy為提示音的名稱,其URI為 content://media/internal/audio/media/89
最後要播放指定的提示音如下

 public static void playSound(Context context, String uri) {
    Uri soundUri = Uri.parse(uri);
    Ringtone sound = RingtoneManager.getRingtone(context, soundUri);
    sound.play();
  }

使用的方法為

playSound(context,"content://media/internal/audio/media/89");//play Alloy
分類
Uncategorized

Android Get MIME Type and open File by Intent

取得MIME之後再搭配Intent即可根據MIME Type開啟應用程式。
public static String getMIMEType(Uri uri)
{
String mimeType = null;
if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
mimeType = SingletonApplication.getInstance().getContentResolver().getType(uri);
} else {
mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
MimeTypeMap.getFileExtensionFromUrl(uri.toString()).toLowerCase());
}
return mimeType;
}
注意參數Uri 的使用如下
File externalStorageDirectoryFilePath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS),”/readme.docx”);
Log.d(TAG,”File MIME:”+getMIMEType(Uri.fromFile(externalStorageDirectoryFilePath));
其中 externalStorageDirectoryFilePath.getAbsolutePath()) 為回傳外部儲存裝置的目錄路徑,
參數Environment.DIRECTORY_DOCUMENTS為指定回傳外部儲存裝置的目錄路徑的
Documents目錄路徑。因此externalStorageDirectoryFilePath.getAbsolutePath()); 回傳路徑如下
/storage/emulated/0/Documents/readme.docx
docx的MIME為
application/vnd.openxmlformats-officedocument.wordprocessingml.document
txt的MIME為
text/plain
接著使用Intent開啟檔案
File externalStorageDirectoryFilePath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS),”/readme.docx”);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(externalStorageDirectoryFilePath,
getMIMEType(Uri.fromFile(externalStorageDirectoryFilePath)));
activity.getContext().startActivity(intent);

分類
Uncategorized

Android layout支援多尺寸螢幕

詳細內容參考官方網站 https://developer.android.com/guide/practices/screens_support.html
以下紀錄簡略記錄。
若是只有1個layout file,Android自動縮放layout上的UI元件來搭配目前運行的裝置。
但因為不同裝置之間的螢幕尺寸差異太大,即使經過自動縮放,UI元件的外觀或位置也會不正常。如5吋手機和10吋平板使用同1個layout file。
因此比較好的方式為根據不同螢幕尺寸加入不同的layout file,讓android自動判斷套用不同layout file。
實作方式為在res目錄下增加相對應的目錄,layout-small,layout-normal,layout-large,layout-xlarge 各目錄會支援不同的螢幕尺寸,然後在各個目錄中新增並調整layout file 的元件。
e.g.
目前必須支援6吋手機以及10吋平板,經過實驗,android 在6吋手機上會套用layout-normal目錄中的layout file,而10吋會套用 layout-xlarge目錄的layout file。
因此新增layout-normal以及layout-xlarge目錄,並放置對應的layout file(activity_main.xml)
最後在到各個activity_main.xml去調整UI。

分類
Uncategorized

Vrapper plugin hotkey

ref: http://vrapper.sourceforge.net/documentation/?topic=optional_plugins#ipmotion
1.vil -> 選擇該行,不包括空白。
2.via -> 選擇argument。
3.vif -> 選擇函式內容。
4.vii -> 選擇縮排。
5.gcc -> 註釋
6.gd -> 移動到宣告處
7.gR -> 重新命名(重構)
8.gr -> 顯示重構選單
9.gm -> 顯示source選單
10. :fm -> format

分類
Uncategorized

android logcat

1.發生異常之後,直接查看最後1個異常以及該異常的第1個棧記錄。E.G.
02-27 14:01:06.126 23653 23653 E AndroidRuntime: java.lang.RuntimeException: Unable to pause activity {com.codefoxx.namingexample/com.codefoxx.namingexample.Mai
nActivity}: java.lang.ArithmeticException: divide by zero
02-27 14:01:06.126 23653 23653 E AndroidRuntime:        at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3660)
02-27 14:01:06.126 23653 23653 E AndroidRuntime:        at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3604)
02-27 14:01:06.126 23653 23653 E AndroidRuntime:        at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4393)
02-27 14:01:06.126 23653 23653 E AndroidRuntime:        at android.app.ActivityThread.access$1000(ActivityThread.java:150)
02-27 14:01:06.126 23653 23653 E AndroidRuntime:        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)
02-27 14:01:06.126 23653 23653 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:102)
02-27 14:01:06.126 23653 23653 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:168)
02-27 14:01:06.126 23653 23653 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:5885)
02-27 14:01:06.126 23653 23653 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
02-27 14:01:06.126 23653 23653 E AndroidRuntime:        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
02-27 14:01:06.126 23653 23653 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)
02-27 14:01:06.126 23653 23653 E AndroidRuntime: Caused by: java.lang.ArithmeticException: divide by zero
02-27 14:01:06.126 23653 23653 E AndroidRuntime:        at com.codefoxx.namingexample.MainActivity.onPause(MainActivity.java:60)
02-27 14:01:06.126 23653 23653 E AndroidRuntime:        at android.app.Activity.performPause(Activity.java:6374)
02-27 14:01:06.126 23653 23653 E AndroidRuntime:        at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1412)
02-27 14:01:06.126 23653 23653 E AndroidRuntime:        at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3639)
02-27 14:01:06.126 23653 23653 E AndroidRuntime:        ... 10 more

第14行為最後一個異常,第15行為該異常的第1個棧記錄。

2.使用ADB + LOGCAT COMMAND LINE

使用格式如下

adb -s abcdefghijklnmopqrstuvwxyz logcat LoginPresenter:d LoginActivity:d *:w

LoginPresenter:D -> 表示只會顯示TAG為LoginPresenter而優先性為Debug
LoginActivity:D -> 表示只會顯示TAG為LoginActivity而優先性為Debug
adb -s abcdefghijklnmopqrstuvwxyz ->表示在連接多數裝置的情況指定其中之一裝置。
*:w -> 表示設定所有TAG(除了在該指令之前的)的優先性為Fatal。
若改為*:S則會將所有TAG(除了在該指令之前的)的優先性設為Silent,而Silent則代表不會輸出任何訊息。
以上的logcat指令代表:
會顯示TAG為LoginPresenter而優先性為Debug,以及TAG為LoginActivity而優先性為Debug,以及其他的TAG只有Fatal會顯示

分類
Uncategorized

.gitignore file pattern

詳細內容參考這篇
https://www.atlassian.com/git/tutorials/saving-changes/gitignore

#忽略所有以name命名的目錄和其子目錄,包含其內的檔案
name/
#忽略所有以name命名的目錄和檔案
name
分類
Uncategorized

The Simple Logging Facade for Java (SLF4J) 使用紀錄

SLF4J主要是提供”方便使用”log的工具,照著以下步驟即可在專案中使用
Step1.
到官網(https://www.slf4j.org/)下載slf4j-api-xxx.jar以及slf4j-simple-xxx.jar
Step2.
把以上的jar檔import到專案中
Step3.
使用方式,首先設定Logger,e.g.,

private Logger mLogger = LoggerFactory.getLogger(SLF4JTest.class);
//SLF4JTest.class通常會代換為使用該mLogger的class

接著印出訊息,e.g.,

        mLogger.info("in test");
        mLogger.debug("in test");
        mLogger.error("in test");
        mLogger.trace("in test");
        mLogger.warn("in test");

最後是簡單的使用測試案例。e.g.,

public class SLF4JTest extends TestCase
{
    private Logger mLogger = LoggerFactory.getLogger(SLF4JTest.class);
    public SLF4JTest(String name) {
        super(name);
    }
    public void test()
    {
        mLogger.info("in test");
        mLogger.debug("in test");
        mLogger.error("in test");
        mLogger.trace("in test");
        mLogger.warn("in test");
    }
}

其他詳細的使用方式請參考官網。

分類
Uncategorized

android 取得裝置資訊(android.os.Build.class.getFields())

source code
note:不一定所有的值都取的到

    public static void getDeviceInfo(){
        Field[] deviceInfo = android.os.Build.class.getFields();
        for (Field one : deviceInfo) {
            try {
                Log.d(TAG, "Name:" + one.getName() + " Value:" + one.get(one));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            }
        }
    }

output

06-07 10:27:56.327 24184 24184 D DeviceUtility: Name:ASUSCID Value:ASUS
06-07 10:27:56.327 24184 24184 D DeviceUtility: Name:ASUSSKU Value:WW
06-07 10:27:56.327 24184 24184 D DeviceUtility: Name:AUTO_START Value:true
06-07 10:27:56.327 24184 24184 D DeviceUtility: Name:BOARD Value:msm8952
06-07 10:27:56.327 24184 24184 D DeviceUtility: Name:BOOTLOADER Value:unknown
06-07 10:27:56.327 24184 24184 D DeviceUtility: Name:BRAND Value:asus
06-07 10:27:56.327 24184 24184 D DeviceUtility: Name:CHARACTERISTICS Value:tablet
06-07 10:27:56.327 24184 24184 D DeviceUtility: Name:COUNTRYCODE Value:TW
06-07 10:27:56.327 24184 24184 D DeviceUtility: Name:CPU_ABI Value:arm64-v8a
06-07 10:27:56.327 24184 24184 D DeviceUtility: Name:CPU_ABI2 Value:
06-07 10:27:56.327 24184 24184 D DeviceUtility: Name:CTA Value:false
06-07 10:27:56.327 24184 24184 D DeviceUtility: Name:DEVICE Value:ASUS_P00I
06-07 10:27:56.327 24184 24184 D DeviceUtility: Name:DISPLAY Value:NRD90M.WW_ASUS_P00I-V5.4.6-20170815
06-07 10:27:56.327 24184 24184 D DeviceUtility: Name:FINGERPRINT Value:asus/WW_ASUS_P00I/ASUS_P00I:7.0/NRD90M/WW_ASUS_P00I-V5.4.6-20170815:user/release-keys
06-07 10:27:56.327 24184 24184 D DeviceUtility: Name:HARDWARE Value:qcom
06-07 10:27:56.327 24184 24184 D DeviceUtility: Name:HOST Value:mec7
06-07 10:27:56.327 24184 24184 D DeviceUtility: Name:ID Value:NRD90M
06-07 10:27:56.327 24184 24184 D DeviceUtility: Name:ISASUSVERMAX Value:false
06-07 10:27:56.328 24184 24184 D DeviceUtility: Name:IS_DEBUGGABLE Value:false
06-07 10:27:56.328 24184 24184 D DeviceUtility: Name:IS_EMULATOR Value:false
06-07 10:27:56.328 24184 24184 D DeviceUtility: Name:MANUFACTURER Value:asus
06-07 10:27:56.328 24184 24184 D DeviceUtility: Name:MODEL Value:ASUS_P00I
06-07 10:27:56.328 24184 24184 D DeviceUtility: Name:PERMISSIONS_REVIEW_REQUIRED Value:false
06-07 10:27:56.328 24184 24184 D DeviceUtility: Name:PRODUCT Value:WW_ASUS_P00I
06-07 10:27:56.328 24184 24184 D DeviceUtility: Name:RADIO Value:unknown
06-07 10:27:56.328 24184 24184 D DeviceUtility: Name:SERIAL Value:GCNPCX1079367R5
06-07 10:27:56.328 24184 24184 D DeviceUtility: Name:SUPPORTED_32_BIT_ABIS Value:[Ljava.lang.String;@3f04769
06-07 10:27:56.328 24184 24184 D DeviceUtility: Name:SUPPORTED_64_BIT_ABIS Value:[Ljava.lang.String;@74695ee
06-07 10:27:56.328 24184 24184 D DeviceUtility: Name:SUPPORTED_ABIS Value:[Ljava.lang.String;@ed08a8f
06-07 10:27:56.328 24184 24184 D DeviceUtility: Name:TAGS Value:release-keys
06-07 10:27:56.328 24184 24184 D DeviceUtility: Name:TIME Value:1502780830000
06-07 10:27:56.328 24184 24184 D DeviceUtility: Name:TYPE Value:user
06-07 10:27:56.328 24184 24184 D DeviceUtility: Name:UNKNOWN Value:unknown
06-07 10:27:56.328 24184 24184 D DeviceUtility: Name:USER Value:android
分類
error message

error LNK 2001 & error LNK 2019 錯誤解決紀錄

詳細訊息請參考 msdn 
造成的因素有很多,這裡記錄解決的方式。
以下錯誤訊息為例。
 

libstrophe.lib(sasl.obj) : error LNK2019: unresolved external symbol _SCRAM_SHA1_ClientKey referenced in function _sasl_scram_sha1
錯誤訊息解釋:

libstrophe.libsasl.objsasl_scram_sha1 函式中存在無法解析的外部符號 SCRAM_SHA1_ClientKey

解決步驟:
1.搜尋 sasl 相關訊息。

通常 sasl.obj 代表存在 sasl 開頭的檔案,因此搜尋專案(libstrophe)中是否存在 sasl 開頭的檔案,經過搜尋之後找到 sasl.c & sasl.h這2個檔案。

2.搜尋 SCRAM_SHA1_ClientKey 相關訊息。

觀察 sasl.c 可以發現在其 sasl_scram_sha1 函式中有呼叫SCRAM_SHA1_ClientKey的動作,e.g.

char *sasl_scram_sha1(xmpp_ctx_t *ctx, const char *challenge,
                      const char *first_bare, const char *jid,
                      const char *password)
{
...
SCRAM_SHA1_ClientKey((uint8_t *)password, strlen(password),
                         (uint8_t *)sval, sval_len, (uint32_t)ival, key);
...
}

 

3.找出 SCRAM_SHA1_ClientKey 的宣告和定義。

在 vs2015 使用 ctrl+shift+f 輸入 scram_sha1_clientkey 搜尋,結果發現SCRAM_SHA1_ClientKey 函式定義在 scram.c,函式宣告在 scram.h。

4.找出 scram.h & scram.c 的位置並加入到該專案中。

手動尋找 libstrophe 專案,發現  scram.c & scram.h 的位置 在 libstrophe-master 資料夾的 src (libstrophe-master/src) 資料夾中,因此在 vs2015 的 Source Files 將 scram.c & scram.h 加入。
完成後重新 build libstrophe 專案,產生的 libstrophe.lib 不會再出現該錯誤。


 
另一種方式是直接 google 錯誤訊息,有時候可以得到快速的解答,e.g.

libstrophe.lib(util.obj) : error LNK2019: unresolved external symbol __imp__timeGetTime@0 referenced in function _time_stamp

直接 google “error LNK2019: unresolved external symbol __imp__timeGetTime@0 referenced in function _time_stamp”
可以找到這篇 http://stackoverflow.com/questions/23408384/visual-studio-2012-error-lnk2019-unresolved-external-symbol-linking-with-stat
簡單的說就是需要加入 winmm.lib
因此在 util.c 直接加入 #pragma comment(lib, “winmm.lib”),就可以解決,e.g.

...
#pragma comment(lib, "winmm.lib")
...

而 #pragma comment(lib, “winmm.lib”) 的詳細內容也請參考 msdn,簡單的說就是連結器會在目的檔(util.obj)放入要搜尋的程式庫(winmm.lib)。

分類
Android

Android Monkey 介紹與使用

描述

Monkey主要是用來做穩定性或是壓力測試,它可以執行在實體裝置或是模擬器上,藉由產生一系列的隨機事件(e.g., touch, click, gestures)來測試應用程序。


基本語法

adb shell monkey [options] <event-count>

[options] 為參數,<event-count>為事件數。


常用範例介紹

1.啟動monkey
直接執行 monkey, 發送event count 數量的事件:

adb shell monkey <event count>

 
2.停止monkey
2-1.搜尋 monkey pid

adb shell ps | grep 'monkey'

2-2.kill monkey by pid

adb shell kill <Step 1.找到的 pid>

Notectrl + c無法停止 monkey
 
3.執行在 com.package.name 上, 發送 event count 數量的事件

adb shell monkey -p com.package.name <event count>

 
4.執行在 com.package.name , 發送 event count 數量的事件,顯示最詳細的訊息

adb shell monkey -v-v-v -p com.package.name <event count>

 
5.執行在 com.package.name , 發送 event count 數量的事件,每個事件等待1秒, 顯示最詳細的訊息,事件隨機分配。

adb shell monkey -v-v-v -p com.package.name --throttle 1000 <event count>

 
6.執行在 com.package.name , 發送 event count 數量的事件,每個事件等待1秒,調整 touch 事件為50%,剩餘百分比隨機分配,顯示最詳細的訊息

adb shell monkey -v-v-v -p com.package.name --pct-touch 50 --throttle 1000 <event count>

 
7.執行在 com.package.name 上, 發送 event count 數量的事件,每個事件等待1秒,調整 touch 事件 50%,motion事件 25%,剩餘百分比隨機分配,顯示最詳細的訊息

adb shell monkey -v-v-v -p com.package.name --pct-touch 50 --pct-motion 25 --throttle 1000 <event count>

 



monkey
參數[options]介紹:

參數總共分4大類,為一般(General)類,事件(Events)類,限制(Constraints)類,除錯(Debugging)類。

一般類

-h : 幫助訊息

adb shell monkey -h
usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...]
              [-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...]
              [--ignore-crashes] [--ignore-timeouts]
              [--ignore-security-exceptions]
              [--monitor-native-crashes] [--ignore-native-crashes]
              [--kill-process-after-error] [--hprof]
              [--pct-touch PERCENT] [--pct-motion PERCENT]
              [--pct-trackball PERCENT] [--pct-syskeys PERCENT]
              [--pct-nav PERCENT] [--pct-majornav PERCENT]
              [--pct-appswitch PERCENT] [--pct-flip PERCENT]
              [--pct-anyevent PERCENT] [--pct-pinchzoom PERCENT]
              [--pkg-blacklist-file PACKAGE_BLACKLIST_FILE]
              [--pkg-whitelist-file PACKAGE_WHITELIST_FILE]
              [--wait-dbg] [--dbg-no-events]
              [--setup scriptfile] [-f scriptfile [-f scriptfile] ...]
              [--port port]
              [-s SEED] [-v [-v] ...]
              [--throttle MILLISEC] [--randomize-throttle]
              [--profile-wait MILLISEC]
              [--device-sleep-time MILLISEC]
              [--randomize-script]
              [--script-log]
              [--bugreport]
              [--periodic-bugreport]
              COUNT

 
-v:顯示log訊息
越多 -v,顯示的訊息越多,最多可以有3-v 

adb shell monkey -v-v-v 10
:Monkey: seed=0 count=10
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages:
//   0: 15.0%
//   1: 10.0%
//   2: 2.0%
//   3: 15.0%
//   4: -0.0%
//   5: 25.0%
//   6: 15.0%
//   7: 2.0%
//   8: 2.0%
//   9: 1.0%
//   10: 13.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.google.android.street/.Street;end
    // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.google.android.street/.Street } in package com.google.android.street
:Sending Flip keyboardOpen=false
:Sending Touch (ACTION_DOWN): 0:(313.0,367.0)
:Sending Touch (ACTION_UP): 0:(313.19876,367.49512)
Events injected: 10
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=247ms (0ms mobile, 247ms wifi, 0ms not connected)
// Monkey finished

2seed=0代表事件使用的隨機數,如果指定相同的隨機數,將會產生相同的事件。
count=10代表事件數量
第3~4行 :IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
代表 monkey 會去執行指定category的類別,預設是LAUNCHER or MONKEY
當在指令中使用 -c 參數時會顯示在這裡,若找不到指定的category會顯示以下訊息。

// Warning: no activities found for category android.intent.category.test
** No activities found to run, monkey aborted.

516行:事件比例,對照如下

// Event percentages:
// 0: 15.0% (--pct-touch )
// 1: 10.0% (--pct-motion)
// 2: 2.0% (--pct-pinchzoom)
// 3: 15.0% (--pct-trackball)
// 4: -0.0% (--pct-rotation)
// 5: 25.0% (--pct-nav)
// 6: 15.0% (--pct-majornav)
// 7: 2.0% (--pct-syskeys)
// 8: 2.0% (--pct-appswitch)
// 9: 1.0% (--pct-flip)
// 10: 13.0%(--pct-anyevent)

1722行:monkey 切換訊息。其中包括 actioncategorycomponent的訊息。action category 請參考 android developer 參考。而 component 即為啟動的 package全名和 activity名稱。
23行之後包含相關的測試訊息觸碰座標,旋轉螢幕等等。


事件類

-s:隨機數,指定相同的隨機數會有相同的事件產生。
–throttle:每個事件之間延遲的時間,以mill second 來計算,預設沒有延遲。
–pct-touch:觸碰事件,觸碰事件為按下放開事件。
–pct-motion:運動事件,運動事件為按下事件加上一連串的隨機事件最後加上放開事件。
–pct-trackball:軌跡球事件,軌跡球事件為一個或多個亂數動作。
–pct-nav:基本導航事件,基本導航事件為裝置的上,下,左,右輸入。
–pct-majornav:主要導航事件,主要導航事件為引發圖形介面的動作(e.g.,返回鍵,或選單鍵)
–pct-syskeys:系統事件,系統按鍵事件為home鍵,返回鍵,撥號鍵,音量鍵等等。
–pct-appswitchactivity啟動事件, activity啟動事件為影響monkey 最大化的平均切換同一個package內的所有activity 的機率。
–pct-anyevent:其他事件,包含以上沒有提到事件。

//執行在 com.example.mypackage 上, 發送 100 數量的事件,調整 touch 事件為10%,motion事件20%,軌跡球事件為 15%,剩餘百分比隨機分配,顯示最詳細的訊息
adb shell monkey -v-v-v -p com.example.mypackage -s 999 --pct-touch 10 --pct-motion 20 --pct-trackball 15 100
限制類

-p:指定 monkey 運作的 package,可以有一個到多個 packagemonkey會啟動在該package內的activity,如果 app 需要存取其他的 packagee.g., 聯絡人)。也必須在此指定。預設是隨機啟動該裝置中任何一個package

//執行在 com.example.mypackage 上, 發送 100 數量的事件,事件隨機分配,顯示最詳細的訊息
adb shell monkey -v-v-v -p com.example.mypackage 100

 
-c: 指定 monkey 運作的 category,通常可用來指定 monkey 啟動的 activitycategory AndroidManifest.xml 中設定(e.g.,預設為啟動Intent.CATEGORY_LAUNCHER or Intent.CATEGORY_MONKEY

//執行在 com.example.mypackage 上, 限制 category 為 LAUNCHER 以及 MONKEY,發送 100 數量的事件,事件隨機分配,顯示最詳細的訊息
adb shell monkey -v-v-v -p com.example.mypackage -c android.intent.category.LAUNCHER -c android.intent.category.MONKEY 100

AndroidManifest.xml example

...
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.mypackage.MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
...

第14行即為 category 指定的方式,因此 monkey 將會執行在com.example.mypakcage.MainActivity 。

除錯類

-hprof:在 monkey 執行事件的前後產生報告,報告大約有 5mb,路徑為data/misc
–ignore-crashesmonkey 預設當測試發生 exception crash 會立即停止,當設定該參數 monkey將不會停止。
–ignore-timeoutsmonkey 預設當測試發生 ANR會立即停止,當設定該參數 monkey將不會停止。
–ignore-security-exceptionsmonkey 預設當測試發生 permission error會立即停止,當設定該參數 monkey將不會停止。
–kill-process-after-errormonkey 預設當測試發生錯誤時不會停止啟動的程序,當設定該參數 monkey將會停止該程序。Note: monkey 成功完成測試後,也不會停止該程序,只會保留在測試結束的最後一個階段。
–montion-native-crashes:監看並報告當測試發生native code 的錯誤。
–wait-dbg:停止執行中的 monkey直到有除錯器連接為止。
–dbg-no-events:設定後,monkey 進入activity 前不會產生事件,一般會和 -v , -p-throttle 一起使用來監視 packages 之間的切換。