Custome View ハマりどころ

| 2012年5月24日木曜日
OnDrawを拡張して、描画機能を持ったViewを作りたいなと思い、サンプルを作成していました。

・参考『素人のアンドロイドアプリ開発日記』様
http://andante.in/i/%E6%8F%8F%E7%94%BB/view%E3%82%92%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%80%81%E5%86%8D%E6%8F%8F%E7%94%BB%E3%82%92%E3%81%99%E3%82%8B%E3%80%82/

まずは、上記サイトを参考にまずは描画機能をお勉強。
だいたいOnDrawに描画処理を書いておけば大丈夫みたい。

で、自分用のサンプル作成。

機能としては、
・四角描く処理を埋め込んだView(Viewを継承したクラス)を、メインのViewに埋め込む。
・メインのViewにはシークバーを設置して、埋め込まれたViewの四角の透明度を変更する。

これだけ。
これだけで意外とはまって、結果的に一週間ぐらい悩んでしまいました。


【ハマりどころ】
・カスタムViewを埋め込んだxmlに表示される謎のエラーメッセージ(←メイン)
Custom view * is not using the 2- or 3-argument
        View constructors; XML attributes will not work
Viewを継承したクラスで、コンストラクタが足りていない場合に出るメッセージ。
*は対象のクラス名
このメッセージが表示されていると、カスタムViewが正しく表示されない。

(今読んだらちゃんとコンストラクタって書いてあるんだな)


      ■解決方法
      ・参考
『IGOE Solutions』(※英語)
Custom view * is not using the 2- or 3-argument View constructors; XML attributes will not work

Viewを継承したクラスで、スーパークラスのコンストラクタをすべて実装すること。

これだけでした。
解決方法は簡単だけど、こんなことでエラーが起こるなんて可能性が思い浮かばないかぎり、解決は難しいですね。このブログに辿りつけてよかった。
 
・画面の再描画
初歩です(でした)。
対象のカスタムViewのinvalidate()メソッドを呼び出す。
これが無いと、onDrawメソッドが呼び出されずに、再描画処理がされません。

・描画位置
テキストの描画位置で特にハマりました。
(図添付予定)

drawTextでは、指定した座標から右上にテキストが描画されます。
このため、座標0,0から描画した場合、テキストは右上に見切れ、画面には表示されません。







Androidでカメラを使う(1)

| 2012年5月8日火曜日
・参考
『素人のアンドロイドアプリ開発日記』
http://andante.in/i/%E3%82%AB%E3%83%A1%E3%83%A9%E3%82%A2%E3%83%97%E3%83%AA/android%E3%81%A7%E3%82%AB%E3%83%A1%E3%83%A9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%82/

1.SurfaceViewを継承し、SurfaceHolder.Callbackインターフェースを実装する


2.マニフェストにカメラのパーミッションを追加する
applicationのタグの前に追加します。
<uses-permission android:name="android.permission.CAMERA">
また、プレビューを表示する予定のActivityに、以下のパラメータを追加
android:screenOrientation="landscape"

3.実装していく
今回扱うのは初めて扱うものばかりだ。
Cameraも初めてなら
SurfaceViewも初めて
ActivityのsetContentViewにSurfaceViewが入るのか!


4.確認
基本的なところを書き終えたので確認。
Emulatorを起動・・・おや画面が真っ白だ。

調べてみたところ、Emulatorではカメラの映像は映らないらしい。
なので実機、MEDIASさんを取り出し接続!

実行、そしてエラー。

    parameters.setPreviewSize(width, height);
でRuntimeException。
中身は、setParameters failed。
ググってみると、有名なエラーで、カメラ開発初心者に対する洗礼のようだ。
Android2.0から発生する仕様で
・参考
『理系のためのTIPS集』
『hiroki.kanaの日常』

getSupportedPreviewSizes();というメソッドで正しく取得できるようだ。
    List<Size> previewSizes = myCamera.getParametors.getSupportedPreviewSizes();
    Size size = previewSizes.get(0);
    parameters.setPreviewSize(size.width, size.height);
    

これで、はじめに紹介した参考サイト『素人のアンドロイドアプリ開発日記』さんと同じ状態のものができました。
引き続き、
『素人のアンドロイドアプリ開発日記』さんの記事を参考に勉強を進めていきます。


[Android]apkファイルの保存

| 2012年4月22日日曜日

apkファイルのローカル保存と、
メール経由で端末にインストールを行いました。

・参照
「public static void main」
http://magpad.jugem.jp/?eid=78

【手順】
1.Eclipseのプロジェクトを右クリック
Androidツール > Export Signed Application Package

2.プロジェクトのチェック
選択したプロジェクトが表示されているかどうか確認します

3.Keystore Selection
キーストアの選択です。
・初回
キーストアはまだないので、
場所とパスワード、パスワードの確認を入力します。

・次回以降
キーストアの場所と、作成時に設定したパスワードを入力します。

4.Key Creation
参考
「usagi1975」
http://www.usagi1975.com/blog/archives/372

エイリアス :アプリの名称
パスワード :キーのパスワード
確認 :キーのパスワードの確認
Validity(Years) :有効期限(年) (通常25年を指定する?)
First and Last Name :作成者の名称?
組織単位 :?
組織 :組織の名称
City or Location :所在地
State or Province :州・地方(日本での統一的な書き方とかあるのかな?)
Country Code :国コード(例:JP)


5.apkファイルの保存先を指定
apkファイルの保存先を指定します。



【メモなど】
keystoreファイルの保存先を指定します。
kyestoreファイルは今生成しようとしているアプリがどのようなものか、
誰が作ったものかを証明するものです。
ここで指定するパスワードは、「非公開鍵」のパスワードと、
非公開鍵を生成される「署名」のパスワード

このあたりが少し難しくてわかりませんでした。
自分なりに整理がついたらまたトピックスにしようと思います。


ブログ用のテキストエディタ探しと、WordPress.com

| 2012年4月7日土曜日
ブログの記事の下書きにはいままでサクラエディタを使用していました。
しかし、その下書きをもとに実際のブログ用の記事をbloggerの投稿画面で行う際、文字装飾を入れるのが少しやりづらいなーと感じていました。
後から文章を読むとどこを強調表示しようとしていたのかわからなくなってしまったり……
初めからBloggerの投稿ページでやるというのも書きづらそう。
それで、投稿用のテキストを編集出来るエディタを探すことにしようと思い立ちました。

で、さっそくブログ編集用のテキストエディタを探してあれこれ試そうとして……
気づきました。

このパソコンにはMicrosoft Office Wordが入っていると!
試してみました。

まずはWordに文字を書いて、

それをBloggerの投稿画面にコピペ。
そしてプレビュー 

ちゃんとフォントそのままコピーされていますね!
きっと出来るんだろうなと思いながら、実際やってみて、本当に出来てちょっと感動しました。
ただ、画像はコピーされてくれないようです(自動アップロードはさすがに無かった)
文字装飾についてはこれからは下書きはWordでよさそうですね。
(探すまでもなかった……)




ところで・・・
調べている過程で知ったのですが、
Windows LiveスペースというMicrosoftのブログサービスは終了していたんですね。2011年に終了していたのですね……(2011 3サービス終了
元記事(実際は、この記事を紹介しているHPでその存在を知りました)
自分で使っていたわけではなく、なんかあったなーという印象だったのですが、
なんでしょう、最近サービス終了という言葉に敏感になったのでしょうかねえ。
わけもなく悲しい気持ちです。



それはそれとして(えっ)
じゃあ、終了してどうなったのかと思ったのですが、記事に大きくロゴが出てますね。

WordPressです。
ええっあの有名な! よく知らないけど、サーバー立ててPHPで!(←よくわかっていない)
そうです、その、アレがWebサービスで利用出来るというのです。
WordPress.com

よくよく調べてみると、
も標準でサポートされているみたいじゃないですか。
・参考(銀メモ -SilveryMemo-)様

こ、これは乗り換え時なんですかね・・・!?
(※blogger3回目の投稿です)

MEDIAS N-04Cを実機につなぐまで

| 2012年4月2日月曜日

●まとめ

1.AndroidSDKへパスを通す

ルートディレクトリの.bash_profileに以下を追記
export PATH=$PATH:Documents/android-sdk-mac_x86/tools
export PATH=$PATH:Documents/android-sdk-mac_x86/platform-tools

2.adb_usb.iniの設定

以下の1行を追記
0x0409

3.実機側の設定

設定>アプリケーション
「不明な提供元」にチェック

設定>アプリケーション>開発
「USBデバッグ」にチェック

4.(作業なし)

5.デバイスを認識させる(ExtensionsにN06CADBDriver.kextを登録)

『8kpx』(http://8kpixel.blogspot.jp/2011/08/mac-os-x-lionn-06c-mediasadb.html
より、N06CADBDriver.kextをダウンロード

パッケージの表示>Contents>info.plist

<key>idProduct</key>
<integer>793</integer>

<key>idProduct</key>
<integer>785</integer>
に変更
再起動



●手順詳細

1.AndroidSDKへパスを通す

[参考]
『Shiratsuki Public Blog > PC >』(Mac OS X でシェルのパスを通す)
http://homepage.mac.com/akihide/iblog/C1557102128/E1968370044/index.html


AndroidSDKのツール郡を使用するには、AndroidSDKの中の下記の2つのフォルダにパスを通しておきます。
・tools
・platform-tools

私の場合「書類」の中にAndroidSDKを配置しているので、以下のような記述になります。
export PATH=$PATH:Documents/android-sdk-mac_x86/tools
export PATH=$PATH:Documents/android-sdk-mac_x86/platform-tools

ターミナルから実行すると、一時的にパスは通りますが、恒常的につながるわけではありません。
恒常的にパスを通すにはルートディレクトリ(ユーザフォルダ直下)に
.bash_profile
をに上記コマンドを追記(無ければ作成し追記)します。

再起動時から、上記のexportが読み込まれるようになります。

以上でパスを通す処理は完了です。

・確認
ターミナルを起動
adb
と入力し、実行。
adbコマンド一覧が表示されればとりあえずOKです。

2.adb_usb.iniの設定

adb_usb.iniがなんなのかは良くわからないのですが……(資料を見つけられず)
本来は触るものでは無いようです。(DO NOT EDITと書かれている)
本来なら、add-onsにmanifest.iniを作ってそこに記述? 下記サイト参照
『tandeLab』
「[Android] adb_usb.ini の正しい書き方」
http://tande.jp/lab/2012/02/1649

よくわからないので、今回はパス。
(adb_usbについてもmanufest.iniについてもadd-onsについても資料が見つけられず ←探し方が悪い)

やったことは、adb_usb.iniに以下の1行を追加すること。
0x0409
これで、adb_usb.iniの設定は完了です。

【補足】0x0409という数字はなにか
この数字は、USBで接続する機器のメーカーIDです。
確認するには、以下を参照します。
アプリケーション>ユーティリティ>システム情報
  ハードウェア>USB
  USB 高速バス>ハブ>N-04C
から、「製造元ID」がこの数字になっているはずです。

3.実機側の設定

端末上でのUSBデバッグモードを許可する設定を行います。
[参考]
「実機(Android端末)でデバッグする」
http://darkroid.net/archives/590

設定>アプリケーション
「不明な提供元」にチェック

設定>アプリケーション>開発
「USBデバッグ」にチェック

以上です。

4.実機の接続を確認する

ネットで情報を調べていると、Macの場合、
ただUSBで接続をするだけで、特別な操作をしなくてもそのまま実機を認識してくれるとあったのですが、
うちの場合うまくいきませんでした。

・実機を認識しない問題
2012年4月1日現在、通常 Mac OS X のバージョンは v10.7 Lion かと思います。
その1個前のバージョン、v10.6 Snow Leopard では、USBケーブルでMacと接続することで、
直ちに認識しMac側で設定は特に必要無かったようなのです。
しかし、現バージョンではそのままUSBを刺しただけでは実機を認識してくれなくなってしまったようです。
(※実機の機種にもよるようです。ここではMEDIAS N-04Cの場合でお話させていただきます)

・状態
認識しない状態とはどういうことか。
MEDIASとMBAをUSBでつなぎます。
この時、MEDIAS側では、USBで接続されたことを認識していますが、
(詳細は忘れてしまったのですが、アンドロイド君のアイコンが出て、USBでつながってる表記が出ていたかと思います)
MBA側でデバイスを確認すると一欄に何も出てきません。

・デバイスの確認の仕方
2種類の確認方法を使いました。
①Eclipseの実行構成のターゲット→手操作
②adbの「devices」コマンド
[参考]
『Androidで行こう!』
「実機(xperia)で開発中のアプリを動かす」
http://d.hatena.ne.jp/zunchax/20110108/1294506182


Eclipseから、
実行>実行構成...
ターゲットタブで手操作を選択
実行ボタンを押下
Choose a running Android Device



この一覧にデバイスが表示されていないときは、デバイスが正しく認識されていません


ターミナルから以下のコマンドを入力。
adb devices
以下の一文の下にデバイスが表示されていないときは、デバイスが正しく認識されていません
「List of devices attached」


5.デバイスを認識させる(ExtensionsにN06CADBDriver.kextを登録)

[参考]
『8kpx』(Mac OS X LionからN-06C Mediasにadbで接続する方法)
http://8kpixel.blogspot.jp/2011/08/mac-os-x-lionn-06c-mediasadb.html

『.h2oのお気楽日記』(Medias(N-04c)をOSX(Lion)で使う方法)
http://d.hatena.ne.jp/dot_h2o2/20110914/p1

今回の肝はここです。
上の参考がN-06Cを接続する方法。
下が、それを参考にしたN-04C版の記事となっています。

技術的なことは良くわからないのですが、『8kpx』さんの開発された、
N-06CドライバをMBAに登録すると認識されるようになるようです。

[手順]
『8kpx』様より、「N06CADBDriver.kext」をダウンロード
右クリック?(指2本タップ)で、パッケージの内容を開く。
Contents>info.plist
中の
<key>idProduct</key>
<integer>793</integer>

<key>idProduct</key>
<integer>785</integer>
に変更します。(たぶん2つあると思いますが、私は上しか変更してません)

変更したkextファイルは、Extentionフォルダに格納するとありますが、そのあたりどうしてもうまく行かなかったので、
以下のソフトを使用しました。

『Kext Helper b7』
http://cheetha.net/


編集したkextファイルをドラッグアンドドロップで指定して、
パスワードを入力→EASYINSTALLボタンを押下
するだけです。


以上の設定を終え、MBA再起動して、MEDIAS N-04Cを接続したところ、
デバイスとして認識され、実行構成でも表示されるようになりました。

MEDIAS N-04Cを指定してアプリを実行すると、
アプリがインストールされ、使用出来る状態になりました。
(そういえばデバッグは試していませんでした)




以上です。
また長くなってしまいました。
誰かの参考になれば幸いです。

MEDIASで実機テスト

| 2012年3月30日金曜日
MacからMEDIASに接続し、MEDIAS上でテストを行うことが出来るよう環境を構築しました。

いろいろ試してみて、なかなかうまく行かなかったので、整理してここに残しておこうと思います。

なお、設定にあたり、一連の手順を以下のエントリに記載しました。
参考にしていただければ幸いです。
MEDIAS N-04Cを実機につなぐまで
http://wonderbird773.blogspot.jp/2012/04/medias-n-04c.html



状態:
MacからMEDIASを認識しない
MEDIASでも接続されていることを認識できない

アプリケーション>ユーティリティ>システム情報
ハードウェア>USB
USB 高速バス>ハブ>N-04C
が認識されない。

結論:(ダメだったポイント)

①USBケーブル

データ通信の出来るUSBケーブルでなくてはいけません
(なんでもいいやと、そこらへんの充電用のケーブルではつながりません……)
データ通信出来るUSBで接続すると、MEDIAS側に「USBデバッグが接続されました」というメッセージが表示されました(歓喜)
ただし、この状態では充電はされないようです。
※参考までに、うまく認識されるようになると、データ通信もできるし、充電も出来るようになっていました。
(USB差した瞬間充電が開始され、デバッグも接続され、すぐにうまく行ったと気づきました!)


②android update adb

このコマンドを使うと何が起こるかというと、
adb_usb.ini
を初期化します。(それ以外もあるのかもしれませんが、これは間違いない)
何を勘違いしたのか、
adb_usb.iniに「0x0409」を追記→「ndroid update adb」により記述がリセット
を繰り返し、編集が反映されないと嘆いていました……。
このコマンドを使うのは「adb_usb.ini」を生成する始めの1回だけです。


③KEXTLOAD

  後述していますが、OSXの最近のバージョンでMEDIASをそのままでは認識してくれないようです。
『8kpx』さんで配付されている「N06CADBDriver.kext」をエクステンションに設置する必要があります。
この設置に以下の2つのコマンドをターミナルに撃ちこむ必要があります。
$sudo chown -R root:wheel /System/Library/Extensions/N06CADBDriver.kext
$sudo kextload /System/Library/Extensions/N06CADBDriver.kext
ですが、どうしても下のkextloadがうまくいきませんでした。
以下のメッセージが表示されます。
「Can't create kext: invalid CFBundleVersion in identifier cache entry entry 329.
Warnings:
    Personality CFBundleIdentifier differs from containing kext's (not necessarily a mistake, but rarely done):
       N06CDevice
       N06CADBInterface
   Kext has no executable or compatible version, so it should not declare any OSBundleLibraries.」
結論を言うと、このコマンドは必ずしも実行する必要はありませんでした。(結局最後までうまくいきませんでした)
ならどうしたのかというと、

以下のツールを使用しました。
「Kext Helper b7」(http://cheetha.net/)
venderIDを変更したN06CADBDriver.kextをドラッグアンドドロップで読み込ませ、
パスワードを入力し、EASY Installボタンを押下。
これがうまく行けば、上の2つのコマンドを実行したのと同じことになります。





私がはまったのは上の3点でした。(基本事項過ぎて涙が出ます)
あとは、いろいろなサイト様に載っている方法を順に試していけば、
うまくいくと思います。
本当はつなげる手順をひと通り追っていこうと思ったのですが、少し長くなってしまったので今回はこれで。