2016年3月24日木曜日

AndroidのImageViewにリモートURL指定で表示できない?

android_image_missingTitaniumの開発でWordPressにアップロードした画像をListView内のImageViewに指定しても表示されず迷走したときの覚書。iOSは表示される。

アプリ環境: Titanium SDK 5.1.2.GA
サーバー環境: CentOS 6.7, nginx 1.8.1, node v4.4.1, PHP 7.0.4, ImageMagick 6.7.2-7

Androidアプリのエラー

[ERROR] TiDrawableReference: (pool-3-thread-1) [1252,2362] Problem opening stream with url http:/hoge.com/wp-content/uploads/members/44/file_1458700008927-640x426.jpg: Resources/http:/hoge.com/wp-content/uploads/members/44/file_1458700008927-640x426.jpg
[ERROR] TiDrawableReference: java.io.FileNotFoundException: Resources/http:/hoge.com/wp-content/uploads/members/44/file_1458700008927-640x426.jpg
[ERROR] TiDrawableReference:    at android.content.res.AssetManager.openAsset(Native Method)
[ERROR] TiDrawableReference:    at android.content.res.AssetManager.open(AssetManager.java:322)
[ERROR] TiDrawableReference:    at android.content.res.AssetManager.open(AssetManager.java:296)
[ERROR] TiDrawableReference:    at org.appcelerator.titanium.util.TiFileHelper.openInputStream(TiFileHelper.java:222)
[ERROR] TiDrawableReference:    at org.appcelerator.titanium.view.TiDrawableReference.getInputStream(TiDrawableReference.java:849)
[ERROR] TiDrawableReference:    at org.appcelerator.titanium.view.TiDrawableReference.getBitmap(TiDrawableReference.java:316)
[ERROR] TiDrawableReference:    at org.appcelerator.titanium.view.TiDrawableReference.getBitmap(TiDrawableReference.java:300)
[ERROR] TiDrawableReference:    at org.appcelerator.titanium.util.TiLoadImageManager$LoadImageJob.run(TiLoadImageManager.java:128)
[ERROR] TiDrawableReference:    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
[ERROR] TiDrawableReference:    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
[ERROR] TiDrawableReference:    at java.lang.Thread.run(Thread.java:818)
[ERROR] TiDrawableReference: (pool-3-thread-1) [111,2473] Problem opening stream with url http:/hoge.com/wp-content/uploads/members/44/file_1458700008927-640x426.jpg: Resources/http:/hoge.com/wp-content/uploads/members/44/file_1458700008927-640x426.jpg
[ERROR] TiDrawableReference: java.io.FileNotFoundException: Resources/http:/hoge.com/wp-content/uploads/members/44/file_1458700008927-640x426.jpg

試して分かったこと

  • PHPで作成した縮小したJPG画像が表示できない
  • アップロードした元ファイルをhttp経由で参照すると表示可能。気のせいだった?
  • 表示できない画像をローカルに置いて指定すると表示可能
  • 全然関係ない別URLの画像は表示可能
  • Android 4.0.3と5.0.2で起きるので多分すべてのAndroidで起きる
  • 縮小画像の作成をphp-gdからphp-pecl-imagickに変更してみても同じ
  • 表示できない画像を別サーバーにおいてみたら表示できた

 

そして気づいた。。。

node.jsでpath.joinすると「http://」が「http:/」になる。

あるあるケアレスミス。半日潰れた。

 

URLをいい感じに繋げるにはnpmパッケージの「url-join」を使った方が安全。

 

< Related Posts >

2016年3月16日水曜日

一眼レフ ニコンD5500を使いこなす便利技

nikon-d5500仕事で一眼レフを使うようになって便利だと思ったテクニックの覚書。

ちなみに撮った写真を使っている広報誌はこちら。

 

まずは「親指AF」。通常シャッターボタン半押しでAF(オートフォーカス)になるのを別のボタンに割り当てる方法。

 

次に「タッチFn」。ファインダーを覗きながら液晶をこするとフォーカスポイントを移動させることができる。

 

そして、Fnボタンを「AFエリアモード設定」に設定しておくことで、「オートエリアAF」になって「タッチFn」が効かない状態から素早く他のモードに切り替えることができる。

Fnボタンは人によって割り当てる機能が違う。

 

カメラが楽しくなってD500が気になるこの頃。しばらくはD5500でレベル上げを頑張ります。

< Related Posts >

2016年3月11日金曜日

Android Studioでplay-services-gcm.jarを作る

google_play_services_gcmGoogle Play Services APIからGoogle Cloud Messaging(GCM)部分を切り出したライブラリ(jarファイル)を作ったときの覚書。

環境: Mac OS X 10.11.3, Android Studio 1.5.1

Android Studioをインストールするまでは前の記事を参考に。

Google Play Servicesから任意のAPIを選択してビルドするための詳細情報は公式サイトを参考に。

 

公式サイトにあるCloud Messagingのチュートリアル通りにやる。

 

GitHubに公開されているサンプルプログラムを利用する。

Cloneする
$ cd Documents/AndroidStudioProjects/
$ git clone https://github.com/googlesamples/google-services.git

Android Studioを開いて
File → New → Import Project...
から
google-services/android/gcm/
を読み込む。

あとはチュートリアルに従って進める。

ダウンロードしたgoogle-services.jsonはappフォルダに配置。

ビルドすると
app\build\intermediates\exploded-aar\com.google.android.gms\play-services-gcm\8.4.0\jars

classes.jar
が出来る。

これがGoogle Play ServicesのGCMクラスライブラリ。多分。

これをgoogle-play-services-gcm.jarにリネームして、gcmjsのlibに置いたら動いたので大丈夫そう。

GitHubにコミットしておいた。

 

< Related Posts >

2016年3月10日木曜日

MacにAndroid StudioをInstall

android_studio_installTitaniumの開発で複数のモジュールがGoogle Play Servicesを使っていると、重複してライブラリを参照しようとしてエラーになる。

これを回避するためにGoogle Play Servicesの必要なAPIだけライブラリにしたjarファイルを作成したくてまずはAndroid Studioからインストール。

環境: Mac OS X 10.11.3, Android Studio 1.5.1

 


1.JDK7に切り替え

使用中のJDKバージョンを確認
$ javac -version

javac 1.6.0_65

前の記事でJDK6とJDK7を共存するように設定したのでJDK7に切り替える。

インストールされているJDK全て表示
$ /usr/libexec/java_home -V

Matching Java Virtual Machines (3):
    1.7.0_80, x86_64:   "Java SE 7"     /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home
    1.6.0_65-b14-468, x86_64:   "Java SE 6"     /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_65-b14-468, i386:     "Java SE 6"     /Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

JDK7に切り替え
$ export JAVA_HOME=`/usr/libexec/java_home -v 1.7`

確認
$ javac -version

javac 1.7.0_80

 


2.Android Studioをインストール

公式サイトからダウンロード

dmgを開いてApplicationsにドラッグ&ドロップすれば終了。

 


3.Android Studioの設定

起動して「Install Type」を選択する画面でCustomを選択して、既にインストールされているAndroid SDKのフォルダを指定。

適当に新規プロジェクトを作ってみる。

 

< Related Posts >

2016年3月8日火曜日

【Titanium】SDK 5.2.0.GAでAndroid向けにビルドするとエラー

titanium_androidTitanium SDK 3.5.1.GAからSDK 5.2.0.GAにあげてビルドしてみると下記エラー

[ERROR] Failed to run dexer:
[ERROR]
[ERROR] Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/actions/ItemListIntents;
[ERROR] Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/actions/NoteIntents;
[ERROR] Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/actions/ReserveIntents;
[ERROR] Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/actions/SearchIntents;
[ERROR] Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/auth/AccountChangeEvent;
[ERROR] Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/auth/AccountChangeEventsRequest;
[ERROR] Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/auth/AccountChangeEventsResponse;
[ERROR] Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/auth/GoogleAuthException;
[ERROR] Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/google/android/gms/auth/GoogleAuthUtil;
[ERROR]
[ERROR] UNEXPECTED TOP-LEVEL EXCEPTION:
[ERROR] java.lang.RuntimeException: Translation has been interrupted
[ERROR]         at com.android.dx.command.dexer.Main.processAllFiles(Main.java:608)
[ERROR]         at com.android.dx.command.dexer.Main.runMonoDex(Main.java:311)
[ERROR]         at com.android.dx.command.dexer.Main.run(Main.java:277)
[ERROR]         at com.android.dx.command.dexer.Main.main(Main.java:245)
[ERROR]         at com.android.dx.command.Main.main(Main.java:106)
[ERROR] Caused by: java.lang.InterruptedException: Too many errors
[ERROR]         at com.android.dx.command.dexer.Main.processAllFiles(Main.java:600)
[ERROR]         ... 4 more

 

jarライブラリを2回読み込んでいるのが原因らしい。

gcmjsのモジュールを使っていると起こるので、modulesフォルダにある「lib/google-play-services.jar」を削除してみるとエラーは出ない。

おそらくti.mapのGoogle Play Servicesと競合していると思う。

ti.map/android/lib/をみると
google-play-services-base.jar
google-play-services-map.jar
がある。

Google Play Servicesは分割できるようになったらしい。

google-play-services-gcm.jarを作ることにした

これは次回以降。

 

後で分かったけど、SDK 5.2.0.GAはAndroid4系でエラーになるので、5.1.2.GAを使うことにした。

 

< Related Posts >

Related Posts Plugin for WordPress, Blogger...

Blog Archives