AndroidStudio0.4がご機嫌斜めです
Android Studioを更新するたびにトラブルになってるような気がする。
しばらくバージョンを上げていなくて、0.3系から0.4.2にアップデートしたところビルドが失敗するようになってしまった。
1つ目
公式にあるように、build.gradleに書いてあるgradleプラグインのバージョンを上げる対応が必要だった。
Change those to "0.7.0" (or 0.7.+ to pick up the latest dot release) :
2つ目
ビルド時に以下のようなエラーが出るようになってしまった。
: duplicate files during packaging of APK /XXX/myapp/build/apk/myapp-debug-unaligned.apk
Execution failed for task ':myapp:packageDebug'.
> Duplicate files copied in APK META-INF/DEPENDENCIES
File 1: /XXX/myapp/libs/httpmime-4.3.1.jar
File 2: /XXX/myapp/libs/httpmime-4.3.1.jar
使っているライブラリによってエラー内容は変わるが、何かプラグインのバグの模様。
ここに上がっているIssueにある解決方法のように
android { packagingOptions { exclude 'META-INF/LICENSE.txt' } }
というように問題になっているファイルをどんどん除外していけばビルドが通るようになるようだ。
android { 中略 packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/DEPENDENCIES' exclude 'META-INF/NOTICE' } }
こんな感じにbuild.gradleに書いてどうにかビルドできた。
メモリダンプ(HPROFファイル)がAndroid Studioから取れるようになったらしいのでバージョンアップしたかっただけなのにかなりハマってしまった。
iOS側でカメラを使って撮った動画をAndroidで再生したいのですが
作ってるアプリで欲しかった機能についてかなりハマりながらもやっとどうにかなったのでメモ。
iOSで撮った動画をAndroidでもどうこうしたいってのがニーズが少ないんだろう…全然ぐぐっても出てこなかった。
iOS側
標準カメラだとmovで保存されてしまうので自前でカメラアプリを実装する必要がある。
よく見たら
という定数があってmp4で書き出すことが標準ライブラリで出来ました
カメラを自分でちゃんと実装するのは大変そうだったのでPBJVisionというライブラリを使っている。
PBJVisionは投稿時点では、kUTTypeQuickTimeMovieを指定して書き出されていたのでうまくAndroid側で再生できていなかった。
kUTTypeQuickTimeMovie -> kUTTypeMPEG4に書き換えて使った
Android側
Androidが標準でサポートしているフォーマットは以下の通り。当然QuickTime形式はありません。
http://developer.android.com/guide/appendix/media-formats.html
ファイルフォーマットがmp4になってしまえばあとはAndroid標準のMediaPlayerクラスを使って再生する実装を行うだけ
この辺りを参考にしつつ実装を進めました。
MediaPlayerにサポート外のファイルを渡した場合にIOExceptionが発生した
具体的に書くと、PBJVisionをそのまま使っていたのでkUTTypeQuickTimeMovieで書き出した、.mp4ファイルを再生しようとして
MediaPlayer.setDataSourceを呼んだときに
java.io.IOException: setDataSourceFD failed.: status=0x80000000
という例外が発生していた。kUTTypeMPEG4を指定して書き出した場合にはうまく再生出来たのでAndroidで再生出来ない形式になってしまっていたというふうに考えている。これ以上詳細は調べられていないので何か知っている人がいたら教えて欲しいところ。
parse.comでプッシュ通知を実装してみた
どっかにちゃんと書いてあったけど割とハマった。
書き出し時にキーチェーンアクセスの分類->自分の証明書のところを選択しておかないと、書き出せないようだ。
Parse.comのサイトからはプッシュ通知ができるけど、アプリ側から発行できない
Parse.comのSetting->Push Notification->Client push enabled?
をONにする必要があった。設定していないと
送信リクエストがParse.com上では確認できるが、送信対象が0と表示されたり、Invalid Targetと表示されたりして、実際には届かない。
自分のアプリではプッシュ通知が受け取れたけど、Testflightで配布したアプリだとプッシュ通知受け取れない
プロビジョニングプロファイルの問題。配布用のプロファイルをTestflightでは使っていて、Apple Push Certificateの項目で設定した証明書が開発用のものにしていたのが原因だった。
無料版では、1つしか証明書が設定出来ないのでとりあえず配布用の証明書を設定した。
parse.comでプッシュ通知を実装してみた
AndroidからiOSに向かってプッシュ通知が出したかったので、parse.comを使ってみました。
ほとんどチュートリアル通りでサクサク実装できてparse.comすごく便利。ロックインされる問題はあるものの、スタートアップとか個人でやる場合は、どんどん使っていいんじゃないかなと。
チュートリアルをまずやりましょう
iOS版はここ
https://www.parse.com/tutorials/ios-push-notifications
Android版はここ
https://www.parse.com/tutorials/android-push-notifications
最初サインインしたときはもっとスマートなチュートリアルに案内されたんだけど、リンクが見つからない・・・。
Androidのチュートリアルは特にハマるところなく出来た。
iOS版は証明書のやりとりがあったりするのでちょっと面倒でした。AppIDをワイルドカードにしてるとダメなので再発行したり色々ごにょごにょ。
iOS版の導入に際して
http://tech.aainc.co.jp/archives/3145
も参考にしました。
cocoapodがされてるようでセットアップ楽チン。
特にハマったところ
証明書を書き出す際に、p12ファイルが選択できない
WiiリモコンをAndroidで動かしたい(楽チン編)
目標
Wiiリモコンを使って自作アプリを動かしたい。あと出来るだけ手抜きで動作検証したい。
- Wiiリモコンをキーボードとして認識させるアプリをインストールする
- キーボードとして動作しているか確認する
※動作確認したのは、Xperia ray(Android2.3.4)です。特に特殊なことはしてないはずなので他のバージョンでも動作はするはず。しなかったら教えて欲しいです。
Wiiリモコンをキーボードとして認識させるアプリをインストールする
いくつかアプリはあるようですが
http://android-k.com/story/3029/
を参考にしつつ、SimpleWiiControllerをインストールした。
ダウンロードはこちらから
インストールしてペアリングしたら、無事認識されました。
キーボードとして動作しているか確認する
一行もコードを書きたくないのでこれも手抜きをした。
githubに上がっているキー入力を画面に出すだけのテストアプリをインストールして、wiiリモコンのボタンを押したときに適当な値が表示されるのを確認できました。
ダウンロードはこちらから
ソースコードは↓のような感じみたいなので、コピーして自分のアプリに組み込むのは簡単かと
https://github.com/chrisboyle/keytest/blob/master/src/name/boyle/chris/keytest/KeyTest.java
まとめ
無事、WiiリモコンをAndroidで認識させて自分のアプリに組み込めそうなことを確認出来た。
もし、別のアプリをインストールしたくないとかあれば
http://wiibrew.org/wiki/Wiimote
とか見つつ、ペアリングの方法とか見て実装すれば出来るのではなかろうか?(試していません)
StoryboardでUIImagePickerControllerを扱いたい
答えはこちら
http://stackoverflow.com/questions/13713242/prepareforsegue-with-uiimagepickercontroller
- storyboardでUIViewControllerを配置
- 配置したUIViewControllerのCustom Classの欄にUIImagePickerControllerと入力する
- prepareForSegueで遷移するときに捕まえて設定をする
これだけでうまく行きました。Storyboardで管理できる画面が増えるとViewを分離できる部分が多くなるので便利
NavigationControllerに接続していたのでこんな感じでprepareForSegueの中身を書きました。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if( [segue.identifier isEqualToString:@"cameraSegue"] ) { UINavigationController* controller = segue.destinationViewController; UIImagePickerController* pickerController = (UIImagePickerController*)controller.topViewController; // ここで好きなように設定をする } }
UICollectionViewのリロードは表示されてるセルしか実際には実行されない
- iphone4
- iOS6
で、UICollectionViewを使ってデータを表示しているときに
セルを再利用するので、セルの中身を非同期で読み込んだりしていると意図しないセルの中身を書き換えたりしまうことがある。
セルを保持しないようにしないといけないので、リロードでうまくいくか試してみた。
UICollectionView:reloadItemsAtIndexPaths
で、リロードをするときに画面に表示されてないセルに対してリロードを実行してもcellForItemAtIndexPathが呼ばれなかった。
セルを保持しないでどんどんリロードしてもよさそう。