こんにちは。
簡単な記事ですが、すぐ忘れてしまうので、書いておきます。
配列を動的に追加したい場合に、よくArrayListを使用しています。
追加後に、配列に変換するには、以下のようにします。
追記:
逆も記載しておきます。
2017年2月21日火曜日
2017年2月20日月曜日
設定の変更をキャッチ
こんばんは。
設定の変更をキャッチするには、以下を利用します。
その為には、以下のようにリスナーを登録しておきます。
解除も書いておきます。
この機能は、非常に便利ですので、是非使いましょう。
設定の変更をキャッチするには、以下を利用します。
その為には、以下のようにリスナーを登録しておきます。
解除も書いておきます。
この機能は、非常に便利ですので、是非使いましょう。
2017年2月14日火曜日
MultiDexについて
こんばんは。
ビルドしているとある日突然、エラーとなりました。
Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
単一の DEX ファイル内で参照できるメソッドの総数が 65,536 に制限されているそうです。
このエラーに単純に対応するのなら、MultiDexについて書かれている、以下を参照してください。
https://developer.android.com/studio/build/multidex.html?hl=ja
しかし、ちょっと待ってください!!
本当にメソッドの総数が65,536を超えるほどに、コーディングしたのでしょうか。
私は、電卓を作成したときでさえ、上記エラーとなってしまいました。
そのときは、疑問を持ちつつ、MultiDexの対応をしました。
電卓ほどの簡単なプログラムでさえ、MultiDexの対応をする必要があることに疑問を持っていたのです。
そもそも、自分ではそんなにコーディングしていません。参照しているライブラリで、65,536を超えていたのです。
例えば、Google Play Serviceを以下のようにbuild.gradleに設定してしまうと、65,536を超えます。
使いたいライブラリだけ参照するようにすれば、参照メソッド数を抑えられます。
例えば、Google DRIVEを使いたい場合、以下のようにすればよいです。
Google Play Serviceは以前は分かれていなかったそうですが、今は、分かれています。
詳しくは、以下を参照してください。
https://developers.google.com/android/guides/setup
選別せずに、Google Play Serviceを丸ごと設定し、MultiDexを設定していると、当然、apkファイルが大きくなってしまいます。
ビルドに時間がかかり、Debug時等のInstallで時間がかかり、時間の無駄です。
いまのところ、本棚もMultiDex対応せずに済んでいます。
ビルドしているとある日突然、エラーとなりました。
Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
単一の DEX ファイル内で参照できるメソッドの総数が 65,536 に制限されているそうです。
このエラーに単純に対応するのなら、MultiDexについて書かれている、以下を参照してください。
https://developer.android.com/studio/build/multidex.html?hl=ja
しかし、ちょっと待ってください!!
本当にメソッドの総数が65,536を超えるほどに、コーディングしたのでしょうか。
私は、電卓を作成したときでさえ、上記エラーとなってしまいました。
そのときは、疑問を持ちつつ、MultiDexの対応をしました。
電卓ほどの簡単なプログラムでさえ、MultiDexの対応をする必要があることに疑問を持っていたのです。
そもそも、自分ではそんなにコーディングしていません。参照しているライブラリで、65,536を超えていたのです。
例えば、Google Play Serviceを以下のようにbuild.gradleに設定してしまうと、65,536を超えます。
使いたいライブラリだけ参照するようにすれば、参照メソッド数を抑えられます。
例えば、Google DRIVEを使いたい場合、以下のようにすればよいです。
Google Play Serviceは以前は分かれていなかったそうですが、今は、分かれています。
詳しくは、以下を参照してください。
https://developers.google.com/android/guides/setup
選別せずに、Google Play Serviceを丸ごと設定し、MultiDexを設定していると、当然、apkファイルが大きくなってしまいます。
ビルドに時間がかかり、Debug時等のInstallで時間がかかり、時間の無駄です。
いまのところ、本棚もMultiDex対応せずに済んでいます。
2017年2月8日水曜日
バーコード読み込みについて
こんばんは。
本棚で、バーコード読み込みに、すごく苦労しました。
本についているバーコード読み込みは、ZBarが優秀らしいと書かれていたので、ZBarを採用することにしました。
ZBarのライブラリは、以下で、ダウンロードできます。
https://sourceforge.net/projects/zbar/files/AndroidSDK/
0.2の方が最新のようです。
しかし!これを落としてきて、実装して、実機で動かそうとしたら、例外発生!
例外内容:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.bnbnapp.bookshelf, PID: 5212
java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/com.bnbnapp.bookshelf-2/lib/arm/libiconv.so: has text relocations
例外箇所:
System.loadLibrary("iconv");
上記の箇所で落ちます。色々試したのですが、上手くいきません。
どうやら、Android 6.0からテキスト再配置をサポートしていないそうです。
この問題を解決するには、ライブラリをコンパイルする際に、gccのコンパイルオプション、-fPICを指定する必要があるそうです。
以下、gccのコンパイルオプション-fPICと-fpicの違いは?より。
「gcc でプログラムをコンパイルする場合に、-fPIC がよく使われます。
-fPIC は、UNIX(Linux)で共有ライブラリ(shared object, シェアードオブジェクト)を作成するときに使われるオプションです。
PIC とは Position-Independent Code の略です。日本語では、位置独立コードとなります。または、位置独立実行形式です。 PIC でコンパイルされたコードは、メインメモリのどこに配置されても、絶対アドレスに関わらず、正しく実行できます。 」
じゃあ、ライブラリを-fPICをつけて、コンパイルしなおせばいいのかと思ってからが、大変でした・・・。
libiconvのソースを落として、NDKでクロスコンパイル、Cygwinでコンパイル、CentOSのLinuxでコンパイル、と試しても、コンパイルエラーとなってしまい、だめでした。
そこで、見つけたのが、以下のページです。
https://github.com/dm77/barcodescanner
コンパイルに成功した上に、その手順まで書いてあります!
しかし、その通りにやったのですが、やはりコンパイルエラーとなります。
iconvのソースは、よくわからなかったのですが、とりあえず、エラーを除去して、動かしてみたのですが、今度は別の例外(たしかmemclrがないというような例外) になってしまい、力尽きました。
結局、dm77さんのライブラリを使わせてもらうことにしました。
本棚で、バーコード読み込みに、すごく苦労しました。
本についているバーコード読み込みは、ZBarが優秀らしいと書かれていたので、ZBarを採用することにしました。
ZBarのライブラリは、以下で、ダウンロードできます。
https://sourceforge.net/projects/zbar/files/AndroidSDK/
0.2の方が最新のようです。
しかし!これを落としてきて、実装して、実機で動かそうとしたら、例外発生!
例外内容:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.bnbnapp.bookshelf, PID: 5212
java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/com.bnbnapp.bookshelf-2/lib/arm/libiconv.so: has text relocations
例外箇所:
System.loadLibrary("iconv");
上記の箇所で落ちます。色々試したのですが、上手くいきません。
どうやら、Android 6.0からテキスト再配置をサポートしていないそうです。
この問題を解決するには、ライブラリをコンパイルする際に、gccのコンパイルオプション、-fPICを指定する必要があるそうです。
以下、gccのコンパイルオプション-fPICと-fpicの違いは?より。
「gcc でプログラムをコンパイルする場合に、-fPIC がよく使われます。
-fPIC は、UNIX(Linux)で共有ライブラリ(shared object, シェアードオブジェクト)を作成するときに使われるオプションです。
PIC とは Position-Independent Code の略です。日本語では、位置独立コードとなります。または、位置独立実行形式です。 PIC でコンパイルされたコードは、メインメモリのどこに配置されても、絶対アドレスに関わらず、正しく実行できます。 」
じゃあ、ライブラリを-fPICをつけて、コンパイルしなおせばいいのかと思ってからが、大変でした・・・。
libiconvのソースを落として、NDKでクロスコンパイル、Cygwinでコンパイル、CentOSのLinuxでコンパイル、と試しても、コンパイルエラーとなってしまい、だめでした。
そこで、見つけたのが、以下のページです。
https://github.com/dm77/barcodescanner
コンパイルに成功した上に、その手順まで書いてあります!
しかし、その通りにやったのですが、やはりコンパイルエラーとなります。
iconvのソースは、よくわからなかったのですが、とりあえず、エラーを除去して、動かしてみたのですが、今度は別の例外(たしかmemclrがないというような例外) になってしまい、力尽きました。
結局、dm77さんのライブラリを使わせてもらうことにしました。
2017年2月7日火曜日
アプリ「本棚」公開
新たにアプリを公開しました。
本管理を行う「本棚」です。
まだ2作目ということもあり、結構苦労しました。
苦労した点などを今後アップしていきたいと思います。
Google Playのリンクは以下です。
Google Play
2017年2月6日月曜日
プライバシーポリシー
Takuya Abeが提供するアプリ「本棚 本の管理と新刊検索」、「CDラック CD管理、新譜検索」、「DVDラック DVDとブルーレイ管理、新作検索」、「底値チェック」は、カメラ機能によるバーコード読み込み、Googleアカウントを使用したGoogle Driveへのバックアップを行います。また、広告が表示され、利用状況解析を行います。
Takuya Abeが提供するアプリ「懸賞生活」、「ダビマスメモ」、「フローティングメモと通知メモ」は、Googleアカウントを使用したGoogle Driveへのバックアップを行います。また、広告が表示され、利用状況解析を行います。
Takuya Abeが提供するアプリ「お買い物電卓」は、利用状況解析を行います。
〇収集する利用者情報
・バーコード読み込み
カメラ機能を使用します。ただし、画像の保存や送信などは一切行いません。
・バックアップ、復元
Googleアカウントを使用して、Google Driveへ接続します。ただし、入力したアカウント情報の保存や送信などは一切行いません。
本アプリをアンインストールすることにより、 情報の収集は直ちに停止されます。
本アプリにおけるご利用者情報の取扱いに関するお問い合わせ、ご相談は以下の窓口でお受けいたします。
bnbnapp@gmail.com
制定日 2017/02/06
改定日 2017/02/23
改定日 2017/04/01 ・DVDラック追加
改定日 2017/08/11 ・自動バックアップについての記載追加
改定日 2018/12/07 ・底値チェック追加
改定日 2022/01/28 ・お買い物電卓追加
・広告について
本アプリでは、広告配信ツールとしてAdMob(Google Inc.)を使用しており、AdMobがご利用者の情報を自動取得する場合がございます。取得する情報、利用目的、第三者への提供等につきましては、以下の広告配信事業者のアプリケーション・プライバシーポリシーのリンクよりご確認ください。
Google 広告に関するポリシー
・利用状況解析ついて
本アプリでは、今後の開発の参考とするため、アプリの利用状況データを収集するツールとしてFirebase(Google Inc.)を使用しており、Firebaseがご利用者の情報を自動取得する場合がございます。取得する情報、利用目的、第三者への提供等につきましては、以下のGoogleプライバシーポリシーのリンクよりご確認ください。
Google プライバシーポリシー
〇利用者関与の方法
本アプリをアンインストールすることにより、 情報の収集は直ちに停止されます。
〇問い合わせ窓口
本アプリにおけるご利用者情報の取扱いに関するお問い合わせ、ご相談は以下の窓口でお受けいたします。
bnbnapp@gmail.com
〇プライバシーポリシーの変更について
本アプリのバージョンアップに伴い、送信される利用者情報、利用目的等が変更される場合があります。変更がある場合には、当サイトで告知致します。制定日 2017/02/06
改定日 2017/02/23
改定日 2017/04/01 ・DVDラック追加
改定日 2017/08/11 ・自動バックアップについての記載追加
改定日 2018/12/07 ・底値チェック追加
改定日 2022/01/28 ・お買い物電卓追加
改定日 2022/09/03 ・懸賞生活、フローティングメモ追加
・自動バックアップについての記載削除
・広告についての記載追加
・利用状況解析ついての記載追加
改定日 2024/06/04 ・デベロッパー名とアプリ名を変更
・広告表示と利用状況解析を各アプリの説明に追記
改定日 2024/12/04 ・お買い物電卓の利用状況解析を追記
非同期処理のCursorLoaderについて
こんばんは。
アプリ開発が大詰めだった為、ブログ更新を怠っていました。
Adsenseの審査が通ったからって、更新止まったらだめですね・・・。
以前、非同期処理の記事を書いていましたが、今日は、CursorLoaderについてです。
CursorLoaderは、文字通りCursorをLoadします。
AsyncTaskLoader<Cursor>をextendsしているので、以前書いたAsyncTaskLoaderと実装方法はあまり変わりません。Cursorを扱う場合は、CursorLoaderを使用した方がいいと思います。
onCreateLoaderとonLoadFinished、onLoaderResetをOverrideします。
あとは、Loaderを実行します。
destoryも忘れずに。
ちょっとはまったのが、Activityで、getLoaderManager()がコンパイルエラーとなったことです。 サポートライブラリのandroid.support.v7.app.AppCompatActivityを使用する場合は、全てサポートライブラリで統一して、Activityでは、getSupportLoaderManager()を使用するようにしました。
CursorLoaderを使用していると、ContentProviderのinsertなどで、以下のようにしておけば、変更があったときに、onLoadFinishedが自動で呼ばれます。
ただし、onLoadFinishedで、Cursorをcloseしてしまうと、変更があっても、onLoadFinishedは呼ばれなくなります。
アプリ開発が大詰めだった為、ブログ更新を怠っていました。
Adsenseの審査が通ったからって、更新止まったらだめですね・・・。
以前、非同期処理の記事を書いていましたが、今日は、CursorLoaderについてです。
CursorLoaderは、文字通りCursorをLoadします。
AsyncTaskLoader<Cursor>をextendsしているので、以前書いたAsyncTaskLoaderと実装方法はあまり変わりません。Cursorを扱う場合は、CursorLoaderを使用した方がいいと思います。
onCreateLoaderとonLoadFinished、onLoaderResetをOverrideします。
あとは、Loaderを実行します。
destoryも忘れずに。
ちょっとはまったのが、Activityで、getLoaderManager()がコンパイルエラーとなったことです。 サポートライブラリのandroid.support.v7.app.AppCompatActivityを使用する場合は、全てサポートライブラリで統一して、Activityでは、getSupportLoaderManager()を使用するようにしました。
CursorLoaderを使用していると、ContentProviderのinsertなどで、以下のようにしておけば、変更があったときに、onLoadFinishedが自動で呼ばれます。
ただし、onLoadFinishedで、Cursorをcloseしてしまうと、変更があっても、onLoadFinishedは呼ばれなくなります。
登録:
投稿 (Atom)
