android.support.test.espresso.AmbiguousViewMatcherException

Android
Espresso

フラグメントやリストなど、何かと繰り返すコンテンツってありますよね?
Androidのテスト用サポートライブラリ、Espressoですが、同じ名前やIDなのに複数存在する要素をテストしようとすると、下記のエラーが出ます。

android.support.test.espresso.AmbiguousViewMatcherException: ‘with id: jp.onlineconsultant.hogehoge:id/take_over_text’ matches multiple views in the hierarchy.
Problem views are marked with ‘****MATCHES****’ below.

 //ビューのxmlレイアウトファイル
    <TableRow
        android:layout_marginLeft="1dp"
        android:layout_marginRight="1dp"
        android:layout_marginTop="1dp"
        android:background="#FFFFFF"
        android:padding="3dp"
        android:id="@+id/sender_take_over_text">
 
        <TextView
            android:id="@+id/take_over_text"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:text="@string/take_over" />
 
        <TextView
            android:id="@+id/take_over"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"></TextView>
    </TableRow>
    <TableRow
        android:layout_marginLeft="1dp"
        android:layout_marginRight="1dp"
        android:layout_marginTop="1dp"
        android:background="#FFFFFF"
        android:padding="3dp"
        android:id="@+id/sender_take_over_text">
 
        <TextView
            android:id="@+id/take_over_text"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:text="@string/take_over" />
 
        <TextView
            android:id="@+id/take_over"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="2"></TextView>
    </TableRow>
 //テストコード
 onView(withId(R.id.take_over_text)).check(matches(withText(R.string.take_over)));

そういう時は、allOfを使って、親要素のIDなどを取得してどちらがどちらか、という判定を作ります。

 onView(allOf(withId(R.id.take_over_text), withParent(withId(R.id.sender_take_over_text))))
  .check(matches(withText(R.string.take_over)));

これでOKです!

withParentだと、直上の親の要素を指定することがあるので、おじいちゃん/おばあちゃんの要素を取りたい場合は

 isDescendantOfA

を使えばOKです。

android.permission.READ_LOGSについて

Android

android.permission.READ_LOGSパーミッションについて

このパーミッションについてAndroidのデベロッパーサイトでは

 Allows an application to read the low-level system log files.

とだけ書いてあります。
標準出力をSDカードなどに書きだして、デバッグに役立てよう、という場合には使えるパーミッションです。

しかし、利用方法を間違えると、セキュリティリスクになってしまいます。
他のアプリからも、当該アプリの情報が収集できてしまうからです。

ログに重要な情報を出力する、というのがそもそも間違いだとは思いますが、えてしてやってしまうことなので、このパーミッションはリリース時には許可しないのがよいでしょう。

(参考)
http://www.atmarkit.co.jp/ait/articles/1106/06/news116_2.html

android java lang runtimeexception fail to connect to camera service

Android

android java lang runtimeexception fail to connect to camera service

現在、カメラ機能を作っていますが、そこで上記のエラーが出て、どうしてもカメラを起動できませんでした。

 mCamera = Camera.open();

で、上記のエラーが起こって落ちちゃうんですね。

AndroidManifest.xmlが悪い可能性が高いなーと思っていろいろやってたんですが、それは関係なかったです。

後は、フラッシュが悪いとか?なんとか?

http://stackoverflow.com/questions/23904459/android-java-lang-runtimeexception-fail-to-connect-to-camera-service

しかし、下記のサイトさんで答えが見つかりました。

http://blogs.yahoo.co.jp/kasakamisaki_rf/11021239.html

そもそもカメラが起動できないときがあるんですね!
スマホの再起動して、直りました。

adbからアプリを強制アンインストールする

Android

adbからアプリを強制アンインストールする

ADB]]とは[[Android Debug Bridgeの略だそうで、Androidのデバイスで、コマンドを入力して色々できるということのようです。

どんな局面で利用するかというと、Androidの開発をしていると、製品版と、開発版を実機でしょっちゅう入れ替えることになりますが、シグネチャーが違うので、いちいちアンインストールしなければならず、結構面倒です。

で、製品版を中途半端にアンインストールして、開発版をインストールしようとすると

[2012-05-31 15:44:37 – Hogehoge] Re-installation failed due to different application signatures.
[2012-05-31 15:44:37 – Hogehoge] You must perform a full uninstall of the application. WARNING: This will remove the application data!
[2012-05-31 15:44:37 – Hogehoge] Please execute ‘adb uninstall hoge.hoge’ in a shell.
[2012-05-31 15:44:37 – Hogehoge] Launch canceled!

と怒られてしまうことがあります…。

仕方ないのでadbを利用します。

ここではWindows7を利用しています。

  1. スタートメニュー→アクセサリ→コマンドプロンプトを選択
  2. adbは、Android SDKをインストールしたフォルダのplatform-toolsというディレクトリにあります。(例:C:\xampp\android-sdk-windows\platform-tools)

adb shell とかで、shellからuninstallとすると、permission deniedなどでアンインストールできません。
suになる方法もあるようですが、面倒なので、上記のようにした方が楽ですね。

  1. コマンドプロンプトで、そのディレクトリまで移動します。
  2. C:\xampp\android-sdk-windows\platform-tools>adb uninstall hoge.hoge

とやります。

adbd cannot run as root in production builds

adb server is out of date. killingと毎回表示される

adbd cannot run as root in production builds

先に謝っておきますが、これはできなかった、という話です。
Android ADBを利用する
のように、ADBを利用できますが、Root権限がないと、肝心のディレクトリが閲覧できなかったりします。
で、マニュアルにある通り

 adb root

とやってみますが、

 adbd cannot run as root in production builds

というメッセージが出て、次に進まないんですよね。

 adb shell
 $su

とやってみても、
permission denied
といわれてしまうだけです。
http://www.karak.jp/blog/xperia-active-root-font.html
などにあったように、してみても、そもそも一度もルートになれていないので、

 mount:Operation not permitted

となってしまうだけです。

機種はHTC ariaです。
うーん、よいお知恵を貸して下さる方がいれば、ぜひお願いします。

やりたかったことはと言えば、とにかく

 INSTALL_FAILED_INSUFFICIENT_STORAGE error

に苦しんでおりまして、それを解決すべく、下記にある解決方法を試してみたかっただけなんですが。

http://stackoverflow.com/questions/4709137/solution-android-install-failed-insufficient-storage-error