旧. -開発日記-

〜とあるプログラマーのつぶやきや開発メモなど〜

Bitmap表示失敗について

W/OpenGLRenderer(20361): Bitmap too large to be uploaded into a texture.

こんなメッセージがlogcatに表示された時は、指定しているBitmapが大きすぎて
表示出来ない場合です。

Android3.0以降では、ハードウェアアクセラレーションが有効になっているActivity内で
2048×2048を超える画像を表示しようとすると上記のエラーが起きることが有ります。

OpneGLREndererがこのようなエラーをログとして残してくれているので
素直に表示される画像を2048×2048以下に縮小するか、
AndroidManifest.xmlでハードウェアアクセラレーションを無効にしましょう。

android:hardwareAccelerated="false"

Nexus7の解像度

今回タブレット(Nexus 7)対応のアプリを制作していて
一瞬ハマった事象があったのでメモ書き。
Nexus7の解像度はhdpi,xdpi,etc...どれになるのでしょう?

私は最初、高解像度ということで無意識にxdpiに該当する画像データを
突っ込みまくってたんですが、どうにもうまく反映されず。
そして調べてみたらなんと「tvdpi」という種類のようで。

てっきりそれようにまた新たに画像を用意しないといけないのかと焦ったのですが、
どうもhdpiのアセットから引っ張ってこられるとか。


ただ作っていてほんと思ったのが、
Androidの解像度問題、やっぱり一筋縄にはいかないというか、大変です。
来年は今の制作体制にAdobe Airのほうを検討しているので
機会があればそちらのほうも書き溜めていきたいと思います。

Vimでタグジャンプ

VimEclipseみたいに即座に目的の関数、変数にジャンプする方法として
Ctagsというのがあるのでメモメモ。

変数、関数、クラス名などなどインデックス化し、
目的の箇所に即座にジャンプ出来るというわけです。いやー、便利。

まずはインストールから。
macportsでインストールします。

$ sudo port install ctags

ここで注意点が1つ。
MacにはもともとCtagsが入っており、/usr/binにインストールされています。
macportsでインストールした場合、/opt/local/binにインストールされてしまいます。

今回はmacportsの方を参照するようにしたいので、.bash_profileに以下を追加。

PATH=/opt/local/bin:$PATH
export PATH

次にtaglist.vimのインストール。
こちらはVundleを使ってインストールします。
あとは環境によりますが自分はNERDTreeとあわせてますので左に表示させてます。

その場合は以下を。

let Tlist_Show_One_File = 1
let Tlist_Use_Right_Window = 1
let Tlist_Exit_OnlyWindow = 1

こんな感じに...。

VundleでVimのPluginを管理

エンジニアなら皆さん何かしら使い込んでるエディタがあるかと思います。
EmacsVimはもちろん、Eclipseなどの便利なIDEも多くあります。
自分は昔から無料で何でも使うタイプだったのでエディタも当然無料を...。

ということでVimを使ってるんですが、
気がついたらプラグインがいっぱいになり、どれがどれかわからない状態に。

そこで使ってるのがVundle。
こちらプラグインを管理するプラグインのようなもので、非常に便利。
ということで備忘録として記載しておこうと思います。




1. Vundleのインストール


GithubのリポジトリからVundleをインストールします。
※gitを予めインストールしておく必要があります

$ cd .vim      #HOMEディレクトリから.vimに
$ git init     #リポジトリを作成
$ git clone http://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

$HOMEから.vimにcd。
そこでgit initをしリポジトリを作成してから上記のコマンドでcloneする形になります。


2. .vimrcに記述


あとは.vimrcに必要な事項を記述します。

" Vundle初期化
set nocompatible
filetype off
set rtp+=~/.vim/bundle/vundle
call vundle#rc()

"Vundleを管理
Bundle 'gmarik/vundle'

"***ここに各必要なプラグインの情報を記述していく***

" github にあるプラグイン
Bundle 'user_name/repojitory_name'  
" vim-scripts プラグイン
Bundle 'scrooloose/syntastic'
" github にないプラグイン
Bundle 'git://git.wincent.com/command-t.git'

"***********************************************

設定が完了したらVim上で

:BundleInstall

と打ってやれば自動でプラグインがインストールされます。

追加も削除も全部この.vimrc上で出来ますので興味が有る方はぜひ。
管理が一気に楽になります。

Vim 〜INSERTモードでカーソルキーが効かない〜

ある日Vimを触っていたらインサートモードにて、
カーソルキーの挙動がおかしかったのでメモメモ。

症状としては、「←↑→↓」を押すと、「ABCD」と打たれてしまうといったもの。
特に.vimrcで設定とかした記憶もなく、なんでこうなったのか未だにわかりませんが、
以下を記述したら直りました。(.vimrcに) 

map ^[[A 
map ^[[B 
map ^[[C 
map ^[[D 

保存した画像のギャラリー反映

こんばんは

業務のほうが依然忙しく、睡眠削ってのAndroidお勉強まっただ中ですが...。
諸々メモ書きとして残しておいた方がよさそうなネタがいくつか
溜まってきたので。


今回は「保存した画像をギャラリーへ反映させる」といったもの。

Androidで、例えば画面のキャプチャーなんかを撮り、
それを保存する処理をした時、必ず1度はハマったのではないでしょうか?
自分は当時一行にギャラリーに反映されないこの現象を
「そういうものなんだAndroidは」と開き直っていました。

ちゃんと対応策がありましたのでメモメモ。

AndroidはMediaScanといった処理を行いデータベース化することで
ギャラリーに反映され、初めて参照することが出来ます。
これはSDカードをマウントした際に発生するため、
実際紹介する処理を行わなくても、手動で一度SDカードマウントすれば
ギャラリーには反映されます。

けどアプリを使っているユーザーはそんなことは気にしないですし、
いざ自分がDLしたアプリで「保存」を押したのにギャラリーの
どこにも 存在していなかったら...
(実際にはマウントすれば見えたかもしれないけれど)


「あれ?」


てことになって不安になってしまいますよね。
なのでユーザビリティから考えても即時反映させられるならしてあげましょう。

//事前にpicturePathには以下のような記述でパスを代入しておく
//String picturePath = Environment.getExternalStorageDirectory().getPath() 
// + "/ディレクトリ名/" + System.currentTimeMillis() +".jpg";

String[] paths = {picturePath};//保存された画像のパス
String[] mimeTypes = {"image/jpeg"};

MediaScannerConnection.scanFile(
  getApplicationContext(), paths, mimeTypes, new OnScanCompletedListener() {

  @Override
     public void onScanCompleted(String path, Uri uri) {
       Log.d("スキャンしたファイルのパス", "-> path=" + path);
       Log.d("ContentProviderのURI", "-> uri=" + uri);
   }
 );

Log.dで、実際スキャンしたファイルのパスと、
ContentProviderのURIが確認出来ます。

これでキャプチャーを撮った画像や独自カメラで撮影した絵などを保存した場合も
即座にギャラリーに反映させてやることが出来ます。

Bitmap使用時のOutOfMemoryError

AndroidでBitmapを扱う処理をする際に発生することがあるOutOfMemoryError。
端末によって発生したりしなかったりするようで、
用はサイズの大きいBitmapを使用するとメモリーが
オーバーフローすることがあるわけです。

例えばGalleryからサムネイル画像を選択し、画像データとして取得する際など
何度も繰り返すと上記エラーが発生して落ちてしまいます。
画像切り出しや、解像度を下げるなどで対処する方法もありますが、
簡単にまずは出来る方法として以下があります。



  • Bitmap.recycle()を使用

再度画像を読みこんで表示するといった場合、
画像読み込み時前に

if(bitmap!=null){
 bitmap.recycle();
}

と行った感じで記述。

Bitmapインスタンスに画像がセットされていれば それを解放してやることが出来ます。
なお、BitmapはImageViewなどにセットして表示することが多いと思いますが、
このメモリオーバーはレイアウト指定による画像読み込みの際には発生しません。

JavaコードによるBitmap生成->ImageViewにaddViewする際は
Bitmap.recycle()だけでは対応出来ません。
その場合は以下のようにimageViewで使用している部分も解放してやります。

Drawable drawable = imageView.getDrawable();
if(drawable!= null){
  ((BitmapDrawable)drawable).getBitmap().recycle();
}

GCでは解放タイミングがOSのバージョンなどにいって様々なため、
上記のようにこちらで意図的に解放してやる必要があります。
DalvicVMがメモリ管理を行っており、どのシーンでメモリ使用量が多くなったか、
DDMSであわせて監視して発生個所を調べてみるのもいいと思います。

本日はこれぐらいにて...。