android.widget.LinearLayout cannot be cast to android.widget.Button

Android

android.widget.LinearLayout cannot be cast to android.widget.Button

レイアウトのxmlファイルも、Acivityでも、ButtonをLinearLayoutなどにキャストしていないのに、なぜか上記のようなエラーが出ました…。
??と思い検索すると

http://stackoverflow.com/questions/11792109/linearlayout-cannot-be-cast-to-android-widget-button

にて、Clean→Buildしたらなおるよ~

と。

本当に治りました。

どっかでそんなキャストしてるのかな?と調べた時間がなんと無駄なことか…orz

本当に、ADTのバカ~[sad]

「バカバカバカバカっ。」
「そんなに怒るなよ…今度、オマエが行きたがってたレストランに連れて行ってやるからヨ」

という本宮ひろ志のマンガに出てくる女泣かせの主人公的なキャラのADTでも妄想して怒りをしずめたいと思います。

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

とやります。