zxingでQRコードを使っていて、AndroidOS6だけカメラ起動時にエラーがでる点解決方法

zxingでQRコードを読み取るアプリを作っていたのですが、
特定の端末だけカメラ起動時に、

「Androidのカメラに問題が発生しました。デバイスを再起動する必要があります。」

なんじゃこりゃ。。

色々検証してみるとAndroidOS6 (マシュマロ)だけの問題なような、。。

logcatで確認してみると、、


Attempt to invoke virtual method 'android.hardware.Camera$Parameters android.hardware.Camera.getParameters()' on a null object reference

こういうエラーが。。zxingライブラリの中身でエラー履いてて、
どうしようも。。

でズバリ解決方法は、
ライブラリアップデート!!!

build.gradle(app)


dependencies { 〜 compile 'com.journeyapps:zxing-android-embedded:3.3.0' 〜 }

3.2から3.3にしたら解決w

あと、androidOS6からか、、カメラの扱う許可ダイアログが表示された。。

参考サイト:
http://stackoverflow.com/questions/37685141/nullpointerexception-with-zxing-library-for-qr-scanning-android-app
https://github.com/journeyapps/zxing-android-embedded

Android ImageViewをシルエット化、色々

android シルエット 透過具合調整

黒で塗りつぶし


ImageView.setColorFilter(Color.BLACK,PorterDuff.Mode.SRC_ATOP);

こんな感じに普通のシルエットができます。

android シルエット
android シルエット

透過具合を指定して、塗りつぶし


ImageView.setColorFilter(R.color.my_color_silhouette,PorterDuff.Mode.SRC_ATOP);

R.color.my_color_silhouetteのxmlファイルも一応

colors.xml


<color name="my_color_silhouette">#ee000000</color>

今度はこんな感じ

android シルエットうっすら黒くなるだけ
android シルエットうっすら黒くなるだけ

↑ これだと思うように透過されません。alphaをffにしても透過された状態になる。。

下記のようにparseColorで透過具合を指定すると。


ImageView.setColorFilter(Color.parseColor("#ee000000"),PorterDuff.Mode.SRC_ATOP);
android シルエット 透過具合調整
android シルエット 透過具合調整

無事イメージどおりの透過具合になりました!

AndroidのFragmentタブ画像をxmlのImageViewで指定

android fragment タブ カスタマイズ リサイズ
android fragment タブ カスタマイズ リサイズ
android fragment タブ カスタマイズ リサイズ

androidのfragmentでタブ画像をカスタマイズした時のメモ。

MainActivity.java


TabLayout mTabLayout = (TabLayout) findViewById(R.id.tab_layout); mTabLayout.setupWithViewPager(viewPager); mTabLayout.getTabAt(0).setText("").setCustomView(android.R.layout.tab_image_view_1); mTabLayout.getTabAt(1).setText("").setCustomView(android.R.layout.tab_image_view_2);

setCustomViewでレイアウトのxmlファイルを指定するのがポイント。

レイアウトは下記

res/layout/tab_image_view.xml


<ImageView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="80dp" android:layout_height="80dp" android:scaleType="centerInside" android:src="@drawable/hoge_image" />

hoge_imageが表示した画像ファイル

Android LMK( Low Memory Killer)に殺されたw

Androidアプリを作っていて、端末によって、バッググラウンドの処理が動いたり動かなかったりしたので、調べてみたらどうやらLMKという空きメモリが少なくなるとプロセスを殺すものがあるようだったので、メモ!

下記のようなログがそいつです!

Low Memory:No more background processes.

Android特有のものらしい、Killされる基準など下記サイトが参考なりました。

http://techbooster.jpn.org/andriod/application/1517/

http://d.hatena.ne.jp/hyoromo/20100509/1273399359

http://blog.cnu.jp/2010/10/11/android-process-kill/

http://d.hatena.ne.jp/misetu/20110108/1294490981

特にonPause等で裏側にまわるアプリなどバッググラウンド処理は、
消される可能性が高いようです。

admob androidアプリに導入時のメモ(version4.3.1に妥協

結構はまったので、メモ。
admobは日本語ドキュメントがないので、結構はまりました。
特に、admob SDKバージョン4.3.1ではまってしまったのですが、admobの広告表示領域に、下記のようなエラーが表示されて解決できませんでした。。

"You must have AdActivity declared in AndroidManifest.xml with configChanges." 

下記、googleのドキュメントを何度読んでもエラーの原因がわからず、、
http://code.google.com/intl/ja/mobile/ads/docs/android/fundamentals.html

ネット上でも、同様な記事がたくさんありましたが探したものすべてを試してみましたが、結局解決せず、さすがに妥協してバージョン4.3.1ではなく、4.0.4を入れるとあっさり動きました。。(汗
version4.0.4は上記ドキュメントのサンプルより利用しました。

そもそも、上記ドキュメントのサンプルもSDKのバージョンが4.0.4なので本当に4.3.1が動くのか検証もできませんでした。
せめて最新VerのSDKサンプルがあれば納得がいくのですが。

Android版のSDK4.3.1で、コード(XMLに記述しない方法)で書いてうまくいった方是非ご教授いただけますと幸いです!(汗汗

 

コマンドラインからjavaを実行&外部ライブラリ指定メモ

Androidじゃない普通のJavaをはじめてみました!

まずコマンドラインからの操作をメモ。

文字出力サンプル(HellowWorld.javaファイル)

class HelloWorld {
 public static void main ( String[] args) {
 System.out.println( "hello world" + args[0]);
 }
}
#javac HelloWolrd.java   //javacで .javaファイルをコンパイル
#java HelloWolrd HOGE      //コンパイルして作られたHelloWorld.classを実行
hello worldHOGE     //出力結果

外部ライブラリを使用する場合

#javac -class 外部ライブラリ名.jar Hoge.java
#java -classpath 外部ライブラリ名.jar Hoge //コンパイル時と実行時両方外部ファイルを教えてあげる必要がある。

java文字列の比較(マッチ)

PHPなどになれていると間違いがちなjavaの文字列比較・・

文字列の比較は下記のようにする。

[java]
String str = “android”;

if (str.equals(“android”))
{

Log.d(TAG,”OK !”);
}
[/java]

下記はNGです。(オブジェクトかどうか調べる場合に利用する)
[java]
if(str == “android”){
Log.d(TAG,”OK !”);
}
[/java]