TAKETOMA's Labo

作成しているAndroidアプリのサポートと
プログラミングやいろんなガジェットについて
備忘録を残していくブログです

ラベル Androidアプリ開発 の投稿を表示しています。 すべての投稿を表示
ラベル Androidアプリ開発 の投稿を表示しています。 すべての投稿を表示

Android Activityの背景を透明にする

Activityの背景を透明にするには
テーマとして設定すれば簡単にできる。

res/values/styles.xmlで以下のように記述


    
        true
        
        true
    
--> これをマニフェストファイルのapplicationなりactivityなりに適用すれば、 背景が透明でタイトルバー(アクションバー)が出ないアクティビティができる

~


or


~


当然ながらapplicationは、アプリケーション全体に適用。
activityは指定したアクティビティに適用される。

Easy Sujiはこの透過背景に背景色をつけて
暗くて後ろが透過しているアクティビティを実現している。


使いどころはアイデア次第かと思われるが
面白半分に使いまくるとわけのわからん画面になること間違いなし。


Easy Sujiは何か文章を記述中に呼び出されるので
前後の文字が何か見えた方が使い勝手がよいかなという理由で透過にしています。

Android アプリ内に画像を保存する

Androidで画像を保存する方法としては以下の3パターンがあるかと思う

1)アプリ内に保存
2)SDカード内に保存
3)データベースに保存

自分のアプリでも1)が一番よく使っている。
SLAMDUNKLineの背景やTextIconCreaterIconPackでアイコンを保存しているのは
アプリ内保存です。

Handromemoは2)の方法でSDカードに保存している。

3)は試したことないけれどバイナリで保存できるはず、、、きっと。


1)の方法で画像を保存する方法はこんな感じで簡単。

FileOutputStream out = null;
try {
    // openFileOutputはContextのメソッドなのでActivity内ならばthisでOK
    out = this.openFileOutput("image.png", Context.MODE_PRIVATE);
    image.compress(Bitmap.CompressFormat.PNG, 100, out);
} catch (FileNotFoundException e) {
    // エラー処理
} finally {
    if (out != null) {
        out.close();
        out = null;
    }
}

保存した画像の読み込みも簡単
InputStream input = null;
try {
    input = this.openFileInput("image.png");
} catch (FileNotFoundException e) {
    // エラー処理
}   
Bitmap image = BitmapFactory.decodeStream(input);

保存した画像の削除
this.deleteFile("image.png");
この方法ならば、画像ファイルだけでなく 各ファイルなんでも保存できるので便利だし、 SDカード使用する際の権限等も不要。

Android OSのバージョン別シェア

Android OSのバージョン別シェアって以下に載っているんだが

http://developer.android.com/about/dashboards/index.html

OSのバージョンの勢力図も刻々と変わってる。

1位 Gingerbread(2.3系) 55.8%
2位 Ice Cream Sandwich(4.0系) 23.7%
3位 Froyo(2.2) 12.9%

4.1のJelly Beanは 1.8%らしい。

Easy Sujiをインストールしている端末比率は以下で、


1位 Gingerbread(2.3系) 59.5%
2位 Ice Cream Sandwich(4.0系) 21.7%
3位 Froyo(2.2) 14.4%
Jelly Beanは 0.2%


Googleが出しているバージョン別シェアとあんまり変わらない。
Easy Sujiは国内にしか提供していないが
世界規模のシェアと変わらないところを見ると日本市場もICSが出回ってきた感じがする。


TextIconCreaterIconPackにしても


1位 Gingerbread(2.3系) 58.0%
2位 Ice Cream Sandwich(4.0系) 18.6%
3位 Froyo(2.2) 15.8%
4位 Eclair(2.1) 4.5%
5位 Jelly Bean(4.1) 1.98% ← かなり上がってきた


こんな感じなので、ICSがかなり普及してきた感じがする。
JellyBeanへのアップデートに関する話もちらほら出てるし、

そろそろ真剣にActionBarとFlagmentの勉強をせねばと思うようになった。

世界のコメント

世界中に公開しているアプリはもちろん世界中からコメントが書かれる

GooglePlayストアではなぜか日本語のコメントしか読めないが
アプリの管理画面ではもちろん全てのコメントが読めるので
ちょっと抜粋してみようと思う。



なぜならば、全然ダウンロード数が
のびないShareTextPickerに
コメントがついたから。




アラビア語で。



^_* تحت التجربة



なんて読むんだ。。。。。

こんな時こそGoogle翻訳さん!!!!!!頼んだ!!




^ _ *保護観察



んなあほな。。。。。。




ちなみに☆4つけてくださってます。
きっと悪い意味ではない。。。
誰か読めたら教えてください。。。。。




他にもいろいろあります。
正しい訳が分かる人教えてください。

訳はすべてGoogle翻訳さんです。


①EGER ELLE YAZMADA ON NUMARA
トルコ語 ☆5つ (Handromemo)
Google翻訳さん 「あなたにマニュアル番号を書き込む」


②Hehe
インドネシア語 ☆不明 (TextIconCreaterForADW)
Google翻訳さん 「ヘヘ」←読んだだけだろ!


③VORREI DARNE 5 MA E' DA MIGLIORARE

イタリア語 ☆4つ (TextIconCreaterForADW)
Google翻訳さん 「私が改善するために5 mAおよび'を挙げてみましょう」



④Tek kelimeyle super monotonluktan kurtuluyor telefonun goruntsu

トルコ語 ☆5つ (TextIconCreaterForADW)
Google翻訳さん 「一言スーパー電話goruntsuで単調を取り除く」



⑤棒 超棒
中国語 ☆5つ (TextIconCreaterForADW)
Google翻訳さん 「恐ろしいスティック」←みたらわかる気はするが、この訳はないだろ


めちゃくちゃうれしくなるコメントもあります。

・O melhor ! Com certeza o melhor. Mais sensivel.
ポルトガル語 ☆5つ (Handromemo)
Google翻訳さん 「最高です!絶対に最高。より敏感。」


・Nice Мне понравилось : )
ロシア語 ☆5つ (Handromemo)
Google翻訳さん 「私はそれが好きです:) ニース」


・echt cool...sieht super aus!

ドイツ語 ☆5つ (TextIconCreaterForADW)
Google翻訳さん 「本当にクールな...素晴らしいですね!」



・AWESOME APP! 
英語 リリース当初このコメントがかなり多かった! (TextIconCreaterForADW)
Google翻訳さん 「素晴らしいアプリ!」


世界中のみなさんありがとうございます。


でも、最近、TextIconCreaterIconPackのコメントで
「お前の英語訳はわけわからんぞ」とお叱りを受けました。
翻訳機能つけたんだから助けてよ!

もっと勉強します。。。

アンドロイダー公認デベロッパー

そういえばアンドロイダー公認デベロッパーになりました。

10月からアンドロイダーがリニューアルされ、その公認デベロッパーになりました。

元々アンドロイダーには、SLAMDUNKLineとHandromemoのレビューが載せられていました。
最近のアンドロイダーは申請してレビュー記事が書かれていたそうでびっくりしました。
こちらに書かれていてびっくり

素人のアンドロイドアプリ開発日記さんのある記事


2010年のXperiaとHT-03Aぐらいしか日本にAndroid端末がなかった時は、
わざわざアンドロイダーから掲載依頼がきていました。SLAMDUNKLineの時かな。
Handromemoはなんか気づいたら掲載されてた。

アンドロイダーの知名度はすごいもので掲載日から
ダウンロード数がぐんぐん伸びたのを覚えています。


そりゃ開発者側から掲載依頼する方が多くなることでしょう。
アンドロイダー側もそれはそれで大変なんでしょう。
依頼から2週間後に掲載されたとか書いてあるし。


なにやらデベロッパー用の管理画面ができ、
アプリのレビュアーユーザー(隊員!?)がいる
アンドロイダーにリニューアルしたとのことです。


リニューアルに伴い、公認デベロッパー以外のレビュー記事はなくなってしまうとのことで
公認デベロッパーに申請したのです。

とりあえず片っ端からアプリは申請しておいたのですが、
今のところ公認アプリは

  • SLAMDUNKLine
  • Handromemo
  • カスタムショートカットアイコン
  • Easy Suji
の4つです。(2012/10/10現在)

リンクは以下です。

androider 私のアプリ一覧のページ


PC用のページはなくなったんですかね?
PCから見てもスマートフォン用みたいな画面になったんですね。

AndroidのレイアウトXMLファイルを分割する

Activityなどのレイアウトを定義しているXMLファイルは分割することが可能。 

同じレイアウトを使いまわしたいときに便利。

使い方はいたって簡単。

使いまわしたいレイアウトファイルがsub_layout.xmlだとすると

以下のようにincludeの一行を入れたい部分に挿入するだけ。


    
    

これで簡単にレイアウトファイルの使い回しが可能になります。

AndroidOSのバージョンを判定する

Androidは、3.Xのタブレット用HoneyCombから2.Xのスマートフォン用に比べて
APIが大きく増えている。

2.X系のスマートフォンでは使えないけれど
3.X系のタブレットでは使用したいAPIがあれば、
AndroidOSのバージョンを判定する必要がある。

AndroidOSのバージョンは

Build.VERSION.SDK_INT

で判断できる。

SDKのAPIレベルが返ってくるのでそれで判断する

    if(Build.VERSION.SDK_INT > 10){
        // HoneyComb以降
    }else{
        // GingerBread以前
    }

インテントで他のアプリと連携する

インテントとはAndroid OSでアプリ間やアプリとシステム間の橋渡しをする
素晴らしい機能です。

自分のアプリでできないことは他の機能を持つアプリにしてもらえばいい
というエコな機能です。

そんなインテントで他のアプリと連携する方法をまとめておく。

・テキストを他のアプリに送るインテント
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_SEND);
    intent.setType("text/plain");
    intent.putExtra(Intent.EXTRA_TEXT, "テキスト");
    startActivity(intent);

・ブラウザを起動するインテント
    Uri uri = Uri.parse("https://www.google.com"); 
    Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
    startActivity(intent);

・画像を取得するインテント
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.setType("image/*"); 
    startActivityForResult(intent, 0);

・マーケット(現Playストア)を検索するインテント
    Uri uri = Uri.parse("market://search?q=" + "検索キーワード"); 
    Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
    startActivity(intent);

・YouTubeアプリで検索するインテント
    Intent intent = new Intent(Intent.ACTION_SEARCH);
    intent.setPackage("com.google.android.youtube");
    intent.putExtra("query", "検索キーワード");
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);

・EverNoteアプリで検索するインテント
    Intent intent = new Intent();
    intent.setAction("com.evernote.action.SEARCH_NOTES");
    intent.putExtra(SearchManager.QUERY, "検索キーワード");
    startActivity(intent);

・明示的にアプリを呼び出すインテント
    Intent intent = new Intent();
    // パッケージ名とアクティビティ名を明示してインテントを呼び出す
    intent.setClassName("パッケージ名", "アクティビティ名");
    try{
  startActivity(intent);
    }catch (ActivityNotFoundException e){
 // 明示的に指定したアプリが見つからない場合、Playストアへ直行する
 Uri uri = Uri.parse("market://details?id=" + "パッケージ名"); 
        Intent it = new Intent(Intent.ACTION_VIEW, uri); 
        startActivity(it); 
    }

AndroidのTextViewをカスタムする

そろそろスマートフォンにもAndroid4.0が普及してきそうだ。 
Android4.0へのアップデート情報や4.0搭載の新機種の話題がたくさん。

タブレットは普及しているのかは不明だが(我が家にはTF101がある)、
GoogleのNexusタブレットはかなり低価格で販売されそうだとの噂もちらほら。

アプリもいろいろとついていかないといけないなぁと思い
最近はもっぱらAndroid Developer's のReferenceを読みふけっている。

Android3.0以降から使えるようになったAPIはたくさんあるので
勉強してアプリに組み込んでいきたい。

今日はTextViewについてメモっとく。 

TextViewは、Android3.0以降から長押しでテキスト選択可能になっている。
テキスト選択するには

TextView#setTextIsSelectable(true)

で選択可能にしてあげると選択モードに切り替わる。 

選択モードになると
すべて選択とコピーがアクションバーに表示されるのだが、
これだけだと微妙に使い勝手が悪い。 

で、選択モードをカスタムできちゃうのがこのメソッド

TextView#setCustomSelectionActionModeCallback()


使用方法はこんな感じ こんなコールバックインターフェースを実装する。

 private class TextSelectActionMode implements ActionMode.Callback {
     
     @Override
     public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
      if ("custom".equals(item.getTitle())){
       // テキストに対してなんらかの処理をする
       // 例えば、選択した文字列を()でくくるとか
      }
         return false;
     }

     @Override
     public boolean onCreateActionMode(ActionMode mode, Menu menu) {
      // アクションアイテムを作る
      MenuItem cutItem = menu.add("custom");
      cutItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
      cutItem.setIcon(R.drawable.icon);
      
         return true;
     }

     @Override
     public void onDestroyActionMode(ActionMode mode) {
     
     }
     @Override
     public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
         return false;
     }
 }
そして、以下のようにTextViewにセットするだけでカスタムしたテキストビューができる。
TextView.setCustomSelectionActionModeCallback(new TextSelectActionMode());

Androidの画面を動画キャプチャしてみた

前々から他のアプリのように
アプリの使用方法動画をマーケットに表示させたいと思っていたので
試してみた。

動画を撮る方法だが、
これまたGoogleCodeにて公開されている

androidscreencast

GoogleCodeで公開されているアプリやライブラリってほんとにすごい

無料でなんでもできてしまう。。。

準備には、AndroidSDKとかJavaとか必要だけど、
開発者の環境には整っているので特段準備はいらない。

使用方法と言えば、
1.SDKのtoolsのddms.batを起動。
2.USBデバッグモードで端末とPCをつなぐ。
3.androidscreencastを起動
4.Recordで保存するファイル名を決めたら保存開始。

最初、何回やってもandroidscreencastが起動できなくて(エラーで起動に失敗)
YOUTUBEで androidscreencast の使用方法を親切に解説してくれる動画を眺めていたら気付いた。

起動時にJava6って表示されるんだがその右下に表示される文字が違っていた。

自分→Sun Microsystems
動画→ORALCE

ORACLEに買収される前からJavaを更新していなかった模様。。。
結構前だな。。

Javaを更新したら、ちゃんと起動するようになったので、
EasySujiの使用動画をキャプチャしてみた。

結構ゆっくり操作したつもりだったけど結構早く動いてキャプチャされてる。

マーケットに表示できるようにしてみた。

ここのサポートページにも貼り付けてみた。

時間のあるときに他のアプリの動画も付けてみようと思う。

GoogleCodeにAndroidプロジェクトを公開

勉強がてらにやってみようと思っていた
オープンソースプロジェクトをApache License 2.0で公開してみた。

たいしたプロジェクトではないですが、
最近、TextIconCreaterForADWに導入してみたNumberPickerDialogを公開。

こんな感じで数値を入力する為だけのダイアログです。

ダイアログ表示時に最小値と最大値を指定できます。
最大値を超えて入力しようとすると数値がブルブルして入力できません。
数値は整数のみ対応しています。

Android標準のNumberPickerWidgetは、わざわざ数値を+1または-1していくしかないので
ちょっと使いづらい気がする。

電卓みたいにポチポチボタンを押す方が私は好みなので作ってみました。

他の方のAndroidアプリに使われたらちょっと嬉しいかも。



このGoogleCodeプロジェクトのリンクは以下から
http://code.google.com/p/taketoma-android-number-picker/

Androidアプリからメールを送る方法

EasySujiの変換候補追加の要望を
Androidマーケットのコメントに書かれることが多かった。

メールの方が事細かにやり取りできると考え、
少し前のバージョンから要望メールを送れるようにした。

その時のTipsが以下
 /**
  * メールを送信
  */
 private void sendMail(){  
        Intent intent = new Intent();  
        intent.setAction(Intent.ACTION_SENDTO);  
        intent.setData(Uri.parse("mailto:" + "hogehoge@gmail.com"));  
        intent.putExtra(Intent.EXTRA_SUBJECT, "件名");
        intent.putExtra(Intent.EXTRA_TEXT, "メールの内容");
        startActivity(intent);  
    }



メールが送れるようになったのはいいんだけれども、
よく本文に何も記載されていないメールが届くようになった。。。

メールが送れるようになったといっても、
インテントでメーラーが起動されるにすぎないので
そのまま送信ボタンを押しちゃうというのは
なにか私の思いがうまく伝わっていないのかな?

配置場所?
説明が足りない?

使用方法がわからないといったコメントもあったので、わかりづらいのかな?

わかりやすい、使いやすいを実現するのはなかなか簡単ではないですね

Androidアプリのソースコード管理

最近、Androidアプリのソースコード管理方法を変えてみた。

以前は、開発用のパソコンにTracLightningをインストールして、
ソースコードのバージョン管理をしていました。
開発用のパソコンといってもそんなに高いスペックではないので、
Tracが起動しているとなかなか重い。
パソコンも5年以上使用していたのでハードディスクが壊れたら、
アプリのソースはきれいさっぱりなくなってしまう危険があったので、
クラウドでバージョン管理できる環境を探してみました。

まず最初に思いついたのは、
GoogleCodeのプロジェクトホスティングサービス

http://code.google.com/intl/ja/projecthosting/


無料で1Gも保存容量があるのだが、
オープンソースプロジェクトである必要がある。
まだ作成したアプリたちのソースコードの公開、
改変されることには躊躇するところがあるので断念した。

でも、近々この辺も勉強がてらに何かのプロジェクトを公開してみようと考えている。


ちょっと話がそれたが、
今はバージョン管理にcikloneというサービスを利用している。

クラウド版バージョン管理システムで、バージョン管理とwiki、チケット管理などができる。

Androidブラウザからのアクセスでも素早くアクセスできた。

個人のフリープランで、
プロジェクト数:1 ユーザー数:5 ディスクサイズ:100M リポジトリ数:3
も使用できる。

100Mまで無料で使用可能ということで
Androidアプリのソースをリポジトリで管理してる。

100Mが多いか少ないかは人にもよるだろうが、
今のところ6つのEclipseプロジェクトをつっこんで10M弱使用している。

チケットやwikiの変更履歴でも容量がかさばっていきそうなので
wikiやチケットは利用せずにケチ臭いがリポジトリのみ使用している。

wikiの代替としてこのブログに開発時のメモなど綴るつもりなので
リポジトリの利用だけで充分事足りてると思う。

使用する容量増えてきたら、有料にアップグレードかまた別の方法を探してみようかな。

cikloneに関しては以下からどうぞ
http://ciklone.com/usage.html

ブログ開設

Androidアプリの開発を始めて早一年半、今さらですがアプリのサポートページを作ろうと思いBloggerにてブログを開設しました。

アプリ毎にサポート用のページを作りました。 簡易的で質素ですが、これから少しずつ充実させていこうかと思います。

サポートページ作成の経緯としては、Androidマーケットのコメントでの要望や不具合報告は返信ができません。 詳細を聞きたくても聞けないことが多々あるので、ユーザーとやりとりができる(ブログのコメント欄ですが)場所を構築してみました。

とりあえず日本語にのみ対応です。 外国のユーザーもいるのですが、英語に流暢ならばがんばってみるのですが…(アプリ名CreatorをCreaterにしちゃってるぐらい英語はできないです。開発初期に気づいたけど、アプリ名は直せても、プログラムのパッケージ名まで直すと別アプリになっちゃうので開き直ってそのままです)

Androidマーケットの説明は、がんばって英語化しているのもあります。 外国のユーザーは感想、要望もメールで頂けることが多いので助かります。(私は英語が下手ですよと前置きして連絡できるので)

件名はhandromemoで 内容が「I love you most」のメールが最近届きました。 とても嬉しかったりします。

いろんな人からこんな言葉を頂けるように勉強しながら、さらにがんばっていこうと思います。