2011年2月22日火曜日

ドコモ版Galaxy S AndroidOS Ver2.2.1バージョンアップ支援

[ドコモ版 Galaxy S SC-02B のアップデートお祝い]

OS2.2.1から新しく追加された壁紙設定を取り上げます。

変更点1.
このバージョンから壁紙の設定のバリエーションが追加されて
Ver2.2までの横長壁紙を基準とした設定から、
縦長壁紙を基準とした設定も選べるようになります。

変更点2.
縦長壁紙を設定すると、壁紙がスクロールせずに固定されます。

変更点3.
ロックスクリーン用壁紙の設定が追加
個別には書きませんが、設定-->画面-->壁紙の順に移動することで
ホーム画面、ロック画面の壁紙設定が可能になっています。(OSの機能では無かったはず)


[Android OS Ver2.2.1からの壁紙の設定方法]

1.ホーム画面でメニューボタンを押します。


2.WallPaperを選びます。日本語だとたぶん「壁紙の設定」


3.表示されるダイアログからHome Screen Wallpaper を選択します。


4.Galleryが表示されます。

5.壁紙として貼り付けたい画像を選択します。

6.画像を選択するとトリミング画面が表示されます。
Android OS Ver2.2.1からは、下の画像にあるように「横長」に加えて
「縦長」タイプのトリミングができるようになりました。

7.トリミング範囲を指定して保存します。


8.壁紙設定完了


-------------------------

※ギャラ壁は、Android OSVer2.2.1とVer2.2では挙動が違います。
Ver2.2ではスクロールするため横に2枚並ぶように壁紙を生成していますが、
Ver2.2.1からは画面固定に対応した1枚壁紙を生成します。


「ギャラ壁 Free/Pro」は上記設定が、自動でできるツールです。
Android用壁紙作成・設定ツール 無料版「ギャラ壁 Free」Ver2.2.0.0
Name: GalaKabe Free
Url: http://market.android.com/search?q=pname:com.blogspot.sakaneya.galakabe


Android用壁紙作成・設定ツール 有料版「ギャラ壁 Pro」Ver2.3.0.0
Name: GalaKabe Pro
Url: http://market.android.com/search?q=pname:com.blogspot.sakaneya.galakabepro

【機能】
・ギャラリーやWEB上の画像を壁紙に変換します。
・WEB上の画像を壁紙として利用できます。
・標準のツールとは違い拡大をしない変換のため、壁紙がぼやけることがありません。但し 横479ドット以下 縦799ドット以下の画像については拡大を行います。

・Exif回転情報付きのJPG画像が適切に扱えます。(Pro版のみ)
・ギャラリーで回転された画像に対応します。(Pro版のみ)
・iPhone用サイズの壁紙の変換が可能です。(Pro版のみ)
・壁紙生成専用のモード(Pro版のみ)

2011年2月21日月曜日

Galaxy SにSDカードが刺さっているかどうかを確認する

一般向けには、Settings->SD card and phone storageで確認出来ます。


以下はプログラムを組む場合について書いてあります。

「まえおき」
現在Galaxy S専用に撮った写真やムービーをSDメモリにバックアップするアプリを作っています。
作っていて問題になったのは、バックアップ先のSDカードが携帯に刺さっているかを判断する方法が「Galaxy S(たぶんシリーズ的に)」存在しないことです。
このような各種チェックはバックアップ先の容量等...を確認するために必要です。


Galaxy Sは他のAndroid機と外部SDメモリの扱いがかなり違います。
端折って書きますが、Galaxy S以外の多くのAndroid機では外部SDメモリが刺さっているかどうかをAPI的に判断出来ます。


たとえば
public boolean isMountedExSD(){
  return Environment.MEDIA_MOUNTED.equals(Environment.MEDIA_MOUNTED);
}
こんな感じ、でもこれはGalaxy Sには使えません。


詳しくはu-sukeの日記「2010-12-11 Nexus one と Galaxy S の違いにハマる
やAndroid会のログ「 Galaxy S の マイクロSDカードマウントについて質問です。
に考察があります。


「対応」
SDカードが抜かれている場合に取得出来る容量は、内蔵メモリ(SD)の容量と同じ事を利用して、下のように組みました。

つまり
アンマウント状態:内部、外部とも同じ容量が返ってくる
マウント済み:内部、外部で違った容量
で判断してます。


/**
* Galaxy Sに外部SDメモリがマウントされているか否か
* @return true:マウントされている false:マウントされていない
*/
public boolean isMountExSD_GalaxyS(){
  //内蔵メモリのパス
  String pathIn = getSdMountedPath();

  //外付けSD用のパス
  String pathEx = getSdMountedPath() + "/" + "external_sd";

  long exAvailableSize = getAvailableSize(pathEx);
  long exALLSize = getSize(pathEx);

  long inAvailableSize = getAvailableSize(pathIn);
  long inALLSize = getSize(pathIn);

  if(exAvailableSize != inAvailableSize && exALLSize != inALLSize)
    return true;
  
  return false;
}

/**
* SDメモリカードパスを取得
* @return
*/
public String getSdMountedPath(){
  File exMountedPath = Environment.getExternalStorageDirectory();
  if(exMountedPath == null)
    return null;
  
  return exMountedPath.getPath();
}

/**
* path先の使用可能容量を返す
* @param path 探索先
* @return 0:失敗 0以外:メモリ容量(Byte)
*/
public long getAvailableSize(String path){
  StatFs fs = new StatFs(path);
  long bkSize = fs.getBlockSize();
  long avaBlocks = fs.getAvailableBlocks();

  return bkSize * avaBlocks;
}

/**
* path先の総容量を返す
* @param path 探索先
* @return 0:失敗 0以外:メモリ容量(Byte)
*/
public long getSize(String path){
  StatFs fs = new StatFs(path);
  long bkSize = fs.getBlockSize();
  long bkCount = fs.getBlockCount();

  return bkSize * bkCount;
}
例外処理とかnullチェックは適当に追加してください。

2011年2月11日金曜日

自分のAndroidアプリに LibAndroTranslationを組み込んで翻訳してもらおう!!

Androidライブラリ「libandrotranslation」を使ってみました。
もの凄く簡単に「翻訳支援機構」が自分のアプリの取り込める事ができてお勧めです。

LibAndroTranslationとは:
libandrotranslation ホームから引用ここから
--------------------------------------------
LibAndroTranslationはAndroidアプリの多言語化を助けるためのライブラリです。

通常、アプリの国際化対応は開発者が行います。

しかし、実際に開発者がたくさんの言語のリソース(strings.xml)を用意することは非常に難しいです。

LibAndroTranslationではすべてのリソースを開発者が用意するのではなく、 アプリ自体にリソースの翻訳画面をもたせて 親切なユーザがリソースを翻訳し開発者に送信できる環境を提供します。


-------------------
引用ここまで


何が便利か:

1.翻訳したいリソースを別に用意する必要が無い
   res/valuses/に存在するxmlリソース名を元に以下の画面の様な
   アクティビティを自動生成してくれます。
送信者 Android blog Sakaneya

翻訳してくれるユーザーは、以下の様に翻訳文を入力することになります。
送信者 Android blog Sakaneya


上記アクティビティのメニューにメールが用意されており、
翻訳結果がXMLファイルとして開発者の元に届きます。

リソース名の突き合わせは必要ありません
そのまま使えるXMLファイルが送られてきます。
送信者 Android blog Sakaneya


2.導入が簡単
導入方法は「Description」にあります。

手順通りeclipseに一度インポートしてしまえば、eclipseにライブラリとして認識されます。
後はただ導入したいプロジェクトにライブラリとして追加するだけです。
送信者 Android blog Sakaneya


3.サンプルがそのまま流用できる
インテントで設定ページのアクティビティを呼ぶだけです。
私はpreferenceの1つに「Translation」という項目を設けて実装しました。
サンプルコードをそのまま使ってます。

送信者 Android blog Sakaneya

Preferenceに項目として出すよう「translation」を記述
/res/xml/preference.xml



  




以下の様に設定を表示するpreference表示アクティビティにリスナーを仕込み
/src/../PreferenceActivity.java
//「その他」カテゴリーのリスナー設定
private void setOther(){
  Preference setOther3 = findPreference("translation");
  setOther3.setOnPreferenceClickListener(new PreferenceClickListener());
}

//リスナー
private class PreferenceClickListener implements OnPreferenceClickListener {
 public boolean onPreferenceClick(Preference preference) {

  if(preference.getKey().equals("translation")){
   translation();
   return true;
  }

  return false;
 }
}
 

それに反応するメソッドを書く(この部分がサンプルソース)
/src/../PreferenceActivity.java続き
private void translation(){

    String mailAddress ="sakaneya@gmail.com";
    String versionName = DeployUtil.getVersionName(this);
    String aboutApp = APPLICATION_NAME + " "+SUFFIX+" ver"+versionName+"\n" ;

    Intent intent = new Intent(this, TranslationListActivity.class);
    // 翻訳データの送信先メールアドレス
    intent.putExtra(TranslationListActivity.INTENT_EXTRA_MAIL_TO, mailAddress);

    // 翻訳データのメールの題名に入るアプリ名
    intent.putExtra(TranslationListActivity.INTENT_EXTRA_MAIL_APPNAME, aboutApp);
    ArrayList ignores = new ArrayList();
    ignores.add("app_name");
    ignores.add("no_i18n.+");

    //無視するリソース名を入れる
    //strings_about.xml
    ignores.add("String_AboutEmailDescription");
    ignores.add("String_AboutTwitter");
    ignores.add("String_AboutTwitterDescription");
    ignores.add("String_AboutBlogDescription");

    // 翻訳画面に表示させたくないリソース名のパターン(正規表現)
    intent.putExtra(TranslationListActivity.INTENT_EXTRA_IGNORE_PATTERNS, ignores);

    // 翻訳データの保存先を変更したい場合に指定する
    // デフォルト Environment.getExternalStorageDirectory()+"/MyTranslation"
    // intent.putExtra(TranslationListActivity.INTENT_EXTRA_DIR,
    //              Environment.getExternalStorageDirectory()+"/LibAndroTranslationSample");
    
    this.startActivity(intent);
}


まとめ.
簡単に導入できるので是非使いましょう。
私の第1弾はスウェーデン語になりそうです。