2017年2月21日火曜日

ArrayListから配列、配列からArrayListへ変換

こんにちは。

簡単な記事ですが、すぐ忘れてしまうので、書いておきます。

配列を動的に追加したい場合に、よくArrayListを使用しています。
追加後に、配列に変換するには、以下のようにします。




追記:
逆も記載しておきます。




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対応せずに済んでいます。

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さんのライブラリを使わせてもらうことにしました。



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へ接続します。ただし、入力したアカウント情報の保存や送信などは一切行いません。

・広告について

本アプリでは、広告配信ツールとして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は呼ばれなくなります。