2

理想的には、デフォルトのブラウザーを開いて Google マップ (台北 101 用) に移動するには、次のコマンドを実行するだけです。

startActivity(action='android.intent.action.VIEW', data='http://maps.google.com/?q=25.033611,121.565000&z=19')

ただし、ステートメントは (常に) 機能しません。monkeyrunner のソース コードをトレースした後:

内部的には、monkeyrunner が単純にパラメーターを文字どおり連結していることを示すスニペットを次に示します。#388 と #411 に注目してください

383    public void startActivity(String uri, String action, String data, String mimetype,
384            Collection<String> categories, Map<String, Object> extras, String component,
385            int flags) {
386        List<String> intentArgs = buildIntentArgString(uri, action, data, mimetype, categories,
387                extras, component, flags);
388        shell(Lists.asList("am", "start",
389                intentArgs.toArray(ZERO_LENGTH_STRING_ARRAY)).toArray(ZERO_LENGTH_STRING_ARRAY));
390    }
...
406    private List<String> buildIntentArgString(String uri, String action, String data, String mimetype,
407            Collection<String> categories, Map<String, Object> extras, String component,
408            int flags) {
409        List<String> parts = Lists.newArrayList();
410
411        // from adb docs:
412        //<INTENT> specifications include these flags:
413        //    [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
414        //    [-c <CATEGORY> [-c <CATEGORY>] ...]
415        //    [-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
416        //    [--esn <EXTRA_KEY> ...]
417        //    [--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
418        //    [-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
419        //    [-n <COMPONENT>] [-f <FLAGS>]
420        //    [<URI>]
421
422        if (!isNullOrEmpty(action)) {
423            parts.add("-a");
424            parts.add(action);
425        }
426
427        if (!isNullOrEmpty(data)) {
428            parts.add("-d");
429            parts.add(data);
430        }
...
479        return parts;
480    }

この場合、次のシェル コマンドが実行されます。

$ am start -a android.intent.action.VIEW -d http://maps.google.com/?q=25.033611,121.565000&z=19
$ Starting: Intent { act=android.intent.action.VIEW dat=http://maps.google.com/?q=25.033611,121.565000 }

[1]   Done                    am start -a android.intent.action.VIEW -d http://maps.google.com/?q=25.033611,121.565000

根本的な原因がアンパサンド (&) であることがわかる場合があります。バックグラウンドで前のコマンドを実行しているシェル環境で特別に解釈されます。

この誤解を避けるために、\ を前に付けてその特殊文字をエスケープできます。

$ am start -a android.intent.action.VIEW -d http://maps.google.com/?q=25.033611,121.565000\&z=19
Starting: Intent { act=android.intent.action.VIEW dat=http://maps.google.com/?q=25.033611,121.565000&z=19 }

startActivityしたがって、monkeyrunner では、この問題を回避するために、パラメーター値を(または他のMonkeyDeviceメソッドに)渡す前にエスケープする必要があります。

startActivity(action='android.intent.action.VIEW', data=r'http://maps.google.com/?q=25.033611,121.565000\&z=19')

最後に、それは動作します!! しかし、monkeyrunner はフレンドリーな API として、内部でこのエスケープを行うべきだと思います。あなたはどのように思いますか?

4

1 に答える 1

1

はい、あなたは絶対に正しいです。これを回避するために私が見つけた他の厄介な方法は、使用することです

device.shell('am start ...')

少なくともあなたは何を期待するかを知っています。

于 2012-11-03T04:27:02.273 に答える