2013年10月17日木曜日

Androidで画像を扱う

目次へ



  • リソースIDからImageViewにイメージを表示する
  • リソースIDで指定した画像をBitmapオブジェクトに変換する
  • Bitmapオブジェクトをbyte配列に変換する
  • byte配列をBitmapオブジェクトに変換する
  • BitmapオブジェクトをImageViewに表示する
  • ImageViewの画像を消す


■リソースIDからImageViewにイメージを表示する

layoutのxmlで指定するなら、次のようにします。
@drawable/ic_launcherはres-drawableの中にic_launcher.pngなどがあったら、その拡張子を除いたものです。
<ImageView
   android:id="@+id/gazou"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:src="@drawable/ic_launcher" />


プログラムの中でリソースに登録された画像をセットするなら次のようになります。
 ImageView v = (ImageView)findViewById(R.id.gazou);
 v.setImageResource(R.drawable.ic_launcher);



■リソースIDで指定した画像をBitmapオブジェクトに変換する

 Resources r = getResources();
 Bitmap bmp = BitmapFactory.decodeResource(r, R.drawable.ic_launcher);



■Bitmapオブジェクトをbyte配列に変換する

SqLiteに保存するときなどbyte配列に変換する必要があります。
上で作成したBitmapオブジェクトをbyte配列に変換するのが下のプログラムです。
compressメソッドの第2引数はcompressorへのヒント用に0-100の値を入れ、0は画像サイズが小さいことを示し、100は大きいことを示します。
ただ、pngなどの形式ではこの値は無視されると書いてありますので、まあ、適当な値を入れておけばよいのでしょう。
また、第1引数は、画像の形式がPNGであることを示します。JPEGなら、CompressFormat.JPEGとなります。
 ByteArrayOutputStream baos = new ByteArrayOutputStream();
 bmp.compress(CompressFormat.PNG, 100, baos);
 byte[] bytes = baos.toByteArray();



■byte配列をBitmapオブジェクトに変換する

今度は逆にbyte配列をBitmapオブジェクトに変換します。
SqLiteに保存されていた画像を表示する時などに必要です。
decodeByteArrayの第2引数はオフセット(bytes配列のどこからか)を示します。
第3引数はオフセットから数えて何バイトを変換するかを示します。
 Bitmap bmp = null;
 byte[] bytes = xxx; //ここに画像データが入っているものとする
 if (bytes != null) {
   bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
 }



■BitmapオブジェクトをImageViewに表示する

上で作成したBitmapオブジェクトをImageViewに表示するには次のようにします。
 ImageView v = (ImageView)findViewById(R.id.gazou);
 v.setImageBitmap(bmp);



■ImageViewの画像を消す

これでよいのかどうかわかりませんが、これを実行するとエラーにもならず、画像は消えます
 ImageView v = (ImageView)findViewById(R.id.gazou);
 v.setImageBitmap(null);



にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2013年10月3日木曜日

GAEでセッションを使う

目次へ



GAEでsessionを使うにはappengine-web.xmlで設定が必要です


■■■■appengine-web.xmlの設定■■■■

WEB-INFの中のappengine-web.xmlファイルに、sessions-enabledのタグを追加します。

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application></application>
<version>1</version>
<sessions-enabled>true</sessions-enabled>  ←これを追加
     :
     :



■■■■セッションにデータを入れるサーブレット■■■■

たとえば、下のプログラムをサーブレットに書くと次のことを実行します。
セッションスコープにsessesという名前で、"session-abc"という文字列を入れます。
チェックのためにリクエストスコープにはreqreqという名前で、"request-ABC"を入れます
その後 abc.jsp にfowardします。

 HttpSession session = req.getSession();
 session.setAttribute("sesses", "session-abc");
 req.setAttribute("reqreq", "request-ABC");
 req.getRequestDispatcher("abc.jsp").forward(req, resp);



■■■■セッションのデータを使うJSP■■■■

forward先のabc.jspでは、次のようにしてセッションスコープの sesses とリクエストスコープの reqreq を表示します。
fowardした場合には、sessesの"session-abc"という文字列も、reqreqの"request-ABC"という文字列も両方表示されます。
しかし、その後、ブラウザを閉じずに(セッションを保持したまま)、abc.jspを直接リクエストすると、リクエストスコープのデータはなくなっているため、 "session-abc"だけが表示されます。

これでGAE上でセッションが使えたことがわかります。

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 <title>abc.jsp</title>
</head>
<body>
  ${sesses}<br/>
  ${reqreq}
</body>
</html>



にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2013年9月28日土曜日

Google App Engine(GAE)とは

目次へ



Google App Engine(以下GAEと書きます)とは、なんなのかを書きます。


■■■■GAEとは■■■■

GAEはGoogleのインフラ上で自作のWebアプリケーションを実行するためのしくみです。
そのために、GAEは次の3つの仕組みを提供しています。
・アプリケーション環境
-Webアプリケーションを実行するための環境
・App Engine SDK
-Webアプリケーションを開発するための開発キット
・管理コンソール
-Webアプリケーションを管理するための機能



■■■■アプリケーション環境■■■■

Webアプリケーションを公開するにはサーバが必要です。
一般的には、レンタルサーバを提供する会社と契約して、サーバを用意します。

このサーバに相当するものとして、GAEでは、アプリケーション環境と呼ばれるWebアプリケーションの実行環境を提供しています。
ここにWebアプリケーションをアップロードすることで、インターネット上に後悔することができます。
次のようなイメージです。


インターネット
   ↓
アプリケーション環境(以下がアプリケーション環境です)
  Webアプリケーション(Java/Python)
  ランタイム環境(Java/Python)
  データストア・サービス・標準インターフェース※


データストア DB
サービス メールサービスなどのサービス。下記参照
標準インターフェース サービス、Java,PythonからDBなどを操作できるAPI



■■■■App Engine SDK■■■■

GAE用のWebアプリケーションを開発するためには、
Google App Engine SDK(Java/Python用)
が必要です。

SDKには、主に次の3つの機能があります。
・アプリケーションの作成・ビルド
・開発用サーバでの動作確認
・アプリケーション環境へのアップロード



■■■■管理コンソール■■■■

管理コンソールを使って、GAE上に公開したWebアプリケーションの管理が行えます。
管理コンソールでは、ログ、データストアの統計情報、その他のリソースの使用料などが確認できます。



■■■■GAEが提供するサービス■■■■

サーブレット&JSP リクエストを受け付けて、画面を返す機能
データストア GAEが準備するデータベースへの読み書き機能
ブロブストア 画像など大きなデータの読み書き機能
チャネル クライアント・サーバ間でのリアルタイム通信を実現する機能
画像処理 画像処理を行う機能(Imagesライブラリ)
メール メールの送受信を行う機能
メモリキャッシュ 頻繁に使われるデータをキャッシュする機能
マルチテナント 1つのアプリケーション上で複数の環境を使用する機能
OAuth認証 OAuth認証を使うための機能
タスクキュー 時間のかかる処理をバックグラウンドで行うための機能
スケジュールタスク 決まった時間や間隔でサーブレットを起動する機能
URLフェッチ GAEから外部のWebサービスを呼び出す機能
ユーザアカウント Googleアカウントまたは、OpenIDを使ったユーザ管理を行うための機能
XMPP インスタンスメッセージを送受信するXMPPを利用するための機能



今回の内容は下の本で調べました。

作ればわかる!Google App Engine for Javaプログラミング

新品価格
¥3,150から
(2013/9/28 17:02時点)




にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2013年9月17日火曜日

AndroidでRadioButtonを使う

目次へ



RadioButtonを使うには、RadioGroupの中にRadioButtonを作成し、 必要な時にどのボタンにチェックがついているかを見ます。


■■■■layoutのリソースを作成■■■■

RadioGroupの中にRadioButtonを入れます。
RadioGroupのorientationを指定するとRadioButtonがその方向に並びます。

    <RadioGroup
        android:id="@+id/radiogroup"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <RadioButton
            android:id="@+id/radio1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="@string/level1" />

        <RadioButton
            android:id="@+id/radio2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/level2" />

    </RadioGroup>



■■■■プログラムでチェックがどれについているか確認■■■■

isCheckedメソッドでチェックが入っているか確認します。

RadioButton r1 = (RadioButton)findViewById(R.id.radio1);
RadioButton r2 = (RadioButton)findViewById(R.id.radio2);

if(r1.isChecked()) {
 radio1がチェックされている時の処理
} else if(r2.isChecked()) {
 radio2がチェックされている時の処理
}




にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2013年8月28日水曜日

公開中のAndroidアプリをバージョンアップする

目次へ



公開しているAndroidアプリをバージョンアップしたいときには、
  • プログラムを変更し、AndroidManifest.xmlでバージョンを指定
  • 新しい署名入りAPKを作成しアップロード
あとは、自動で知らせがいくのでユーザが自分でアップロードすることになります。


■■■■バージョンを指定する■■■■

AndroidManifest.xmlでバージョンを指定します。
android:versionCode で指定するのは以前のバージョンより大きい整数です。
android:versionNameに指定するのがインストールする時などに表示されるバージョンになります。

     :
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xx.xx"
    android:versionCode="2"
    android:versionName="1.1" ?>
     :

■■■■APKファイルを作成しアップロード■■■■

この後このページの「署名入りAPKファイルを作成」の方法で新しいAPKファイルを作成します。

その後、同じページの「APKファイルをアップロード」の方法で今作成したAPKファイルをアップロードします。

これだけでインストールしているユーザには新しいバージョンがあるとのしらせがあるため、必要な人はバージョンアップしてくれるはずです。


にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2013年8月23日金曜日

AndroidアプリにAdMobを使ってバナーを表示する

目次へ



Google AdMob Ads SDKを使ってAndroidアプリにバナーを表示するには次のことが必要です
また、これについては Google AdMob Ads Android(初級)のページを参照してください

  • Google Mobile Ads SDKをダウンロードし、Eclipse に組み込む
  • AdMobと契約
  • AdMobにアプリを登録
  • アプリにAdView(バナーを表示するためのビュー)を表示
    1. AndroidManifest.xmlでINTERNETとACCESS_NETWORK_STATE権限を設定
    2. AndroidManifest.xmlでAdMob SDKを使うためにactivityの宣言
    3. 方法①layoutのxmlファイルでAdViewを表示する
    4. 方法②プログラムでAdViewを表示する


■■■■Google Mobile Ads SDKをダウンロードし、Eclipse に組み込む■■■■

  • https://developers.google.com/mobile-ads-sdk/download?hl=jaのページで GoogleAdMobAdsSdkAndroid.zipをダウンロードし展開
  • Eclipseを開き、その中のjarファイルをアプリのプロジェクトのlibsフォルダにコピー
  • 今コピーしたjarファイルをビルドパスに追加
    Eclipseのパッケージエックスプローラでプロジェクトをクリックした後、メニューの[プロジェクト]-[プロパティ]-[左のメニューからjavaのビルドパス]をクリック
    [ライブラリタブ]をクリックし[外部jar追加ボタン]を押し、jarファイルを追加
これで、com.google.ads.AdView(これがバナーを表示するためのビュー)が使えるようになります

■■■■AdMobと契約■■■■

AdMobへの申し込みページで申し込みを行います。 支払いを受け取るために、銀行口座などが必要です

■■■■AdMobにアプリを登録■■■■

AdMobのページでログインします。
サイト/アプリケーションの追加ボタンを押し、アプリを登録します。


■■■■AndroidManifest.xmlの設定■■■■

AndroidManifest.xmlで
  • com.google.ads.AdActivityの宣言
  • 権限
が必要です
次の例はGoogle AdMob Ads Android(初級) に記載されていたxmlの例です
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.company"
          android:versionCode="1" android:versionName="1.0">
  <application android:icon="@drawable/icon" android:label="@string/app_name"
               android:debuggable="true">
    <activity android:label="@string/app_name" android:name="BannerExample">
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
    </activity>
    <activity android:name="com.google.ads.AdActivity"
          android:configChanges=
          "keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
  </application>
  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
</manifest>
2つ目のactivityとuses-permissionが必要です

■■■■layoutのxmlファイルでAdViewを表示■■■■

Adviewをlayoutのxmlファイルに書くか、プログラムの中でAdViewを作成すればそこに、バナーが表示されます。
まず、layoutのxmlファイルで設定する方法

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"  これがads:を使うために必要
 以下省略>    




    <com.google.ads.AdView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"  1番下に表示したいなら
        ads:adSize="BANNER"
        ads:adUnitId="パブリッシャID"         パブリッシャIDを知る方法は下で
        ads:loadAdOnCreate="true"
        ads:testDevices="TEST_EMULATOR, TEST_DEVICE_ID" />



バナーを入れたい場所にcom.google.ads.AdViewを作成します。
ここで使っているads:は1番最初のタグで設定しておきます。

パブリッシュIDを知る方法
AdMobのページにログインします。
下の方に登録されているアプリの名前が出ています。
その名前にマウスのポインタを乗せるとレポートボタンと設定を管理ボタンが表示されますので、設定を管理ボタンを押します。
すると、次のページでアプリの名前の下にサイトURLとパブリッシャーIDが表示されています。
それをマニフェストファイルの ads:adUnitIdに設定します

■■■■プログラムでAdViewを表示■■■■

次はプログラムでAdViewを作成する方法です。

private AdView adView;
protected void onCreate(Bundle savedInstanceState) {
    
            省略
    adView = new AdView(this, AdSize.BANNER, "パブリッシャーID");
    RelativeLayout layout = (RelativeLayout)findViewById(R.id.xx);
    layout.addView(adView);
}
@Override
public void onDestroy() {
    adView.destroy();
    super.onDestroy();
}






にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2013年8月22日木曜日

Androidアプリを公開する

目次へ



Androidアプリを公開するまでの流れ
  1. Googleアカウントを作成する
  2. デベロッパーアカウントを作成する(登録料 $25)
  3. アプリを作成し、公開用にデジタル署名したAPKファイルを作成する
  4. APKファイル作成時のMissingTranslationエラー解決方法 追加
  5. 公開用にアプリのキャプチャー画像、アイコン、説明文を作成する
  6. APKファイルをアップロードする


■■■■Googleアカウントを作成■■■■

Googleアカウントを作成のページでアカウントを作成します。
すでにアカウントを持っている場合は必要ありません。

■■■■デベロッパーアカウントを作成■■■■

  • https://play.google.com/apps/publish/signup/のページでGoogleアカウントを使ってログインします
  • デベロッパー契約に同意します
  • 支払いに進むボタンをクリックします
  • 氏名、クレジットカード番号、デベロッパー名、メールアドレス、電話番号などを入力し、クレジットカードから$25支払います
    電話番号は03-1111-1111なら、+81-3-1111-1111などと入力します。+81が日本。市外局番の先頭の0は省略


■■■■署名入りAPKファイルを作成(Eclipseで作成)■■■■

ここでは証明書の設定をしています。証明書は、公開鍵が本人のものであることを証明します。 一般的には認証局によって発行されますが、Androidアプリで使用する証明書は自分で作成した(自己認証局)証明書を使います。

  • Eclipseでプロジェクトを右クリックし[Androidツール]-[署名アプリケーションパッケージのエクスポート]
  • 最初のページでプロジェクト名を確認
  • Keystore selectionのページで create new keystoreにチェックを入れ
    ロケーション 自分で決めたフォルダ\wings.keystore
    パスワード  自分で決める

    いったんキーを作成してしまえば、次からバージョンアップなどの時には、use existing keystoreにチェックを入れ、ロケーション、パスワードは今決めたものを指定します
  • KeyCreationのページで
    エイリアス  任意のキーの別名
    パスワード  さっきのパスワードと違ってもいいようですが、とりあえず同じにしました
    確認     パスワードをもう1回
    Validity   鍵の有効期限として 25を入力 25以上が推奨されている
    First and Last Name  任意の作者名
    その下すべて省略
    First and Last NameからCountry Codeまでは省略可能ですが、少なくともどれか一つの項目を入力する必要があります
  • Destination and key/certificate checksページで
    Destination APK file  任意のフォルダ\xxx.apk


■■■■APKファイル作成時MissingTranslationエラー解決方法 ■■■■

2014年6月30日追記

久しぶりにAPKファイルを作成しようとしたところ、string.xmlファイルでエラーが起き、APKファイルが作成できなくなってしまいました。
APKを作成しようとする前までは、全く文句を言われなかったのに、署名アプリケーションパッケージのエクスポートをクリックすると、string.xmlにエラーが表示されてしまいます。

MissingTranslationというLintエラーのようです。
これは、よくわからないのですが、いろいろな言語に対応するstring.xmlが必要だけどないよ というエラーのようです。
その対策は、MissingTranslationをエラーとしなければよいとのことで次の方法で、MissingTranslationをワーニングエラーとすることで解決しました。

ECLIPSEのメニューから[ウィンドウ]-[設定]-[Android]-[Lintエラー検査]-[Idの中のMissingTranslationをクリック]-[Severityと書いてあるコンボボックスからWarningを選択]

これで、APKファイルを作成できました。

これについてはここで教えていただきました


■■■■APKファイルをアップロード■■■■

https://play.google.com/apps/publishのページでまだログインしてなければGoogleアカウントでログインします
タイトルなど必要な情報を入力し、アップロードします

もし、パッケージ名をcom.example.xxの名前にしていると、APKファイルをアップロードできません。
その時はパッケージ名を変更して、APKファイルを作成しなおしてから、もう1度アップロードをしてください。
パッケージ名を変更する方法はこちら(Androidアプリのパッケージ名を変更する)です。


にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2013年8月21日水曜日

Google Analytics にbloggerで作成したブログを追加

目次へ



すでにGoogle Analyticsを使っており、別のブログなどの解析も追加したい場合、新しくそのページを追加することができます。
Google Analyticsでは、解析したいページをプロパティと呼びます。


■■■■トラッキングIDを取得■■■■

  • Google Analyticsにログインします。
  • 右上にあるAnalytics設定をクリックします。
  • プロパティの列のコンボボックスをクリックし新しいプロパティを作成を選択します
  • ウェブサイトを選択し、サイトの名前(好きに決める)、サイトのURLを入力します
  • 業種を選択しタイムゾーンを日本にします
  • トラッキングIDを取得ボタンを押すと、トラッキングIDとトラッキングコードが表示されますので、トラッキングIDをコピーしておきます。

■■■■ブログ(blogger)にトラッキングIDを設定■■■■

  • bloggerにログインし解析をしたいブログを表示します。
  • 左のメニューの「設定」-「その他」をクリックします。
  • 1番下にGoogle AnalyticsのウェブプロパティIDを入力する場所があるので、さきほどコピーしたトラッキングIDを入力します。
  • 右上の設定を保存ボタンを押し終了。
  • Google Analyticsのホームのボタンを押すと、新しく追加したサイトが表示されています



にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

目次

Androidについて

Swingについて

Google App Engineについて

その他



にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2013年8月19日月曜日

AndroidManifest.xml で meta-data を使う

目次へ



AndroidManifest.xmlの中にデータに名前をつけて登録しておくと、そのデータを登録した名前で使うことができます。


■■■■AndroidManifest.xmlに登録■■■■

<br/>
たとえば、AndroidManifest.xmlでnamaeという名前でdataというデータを登録しておきます( ① )。

<pre>
    <application ...>
        <activity...>
            :
        </activity>
        <meta-data android:name="namae"  android:value="data" >         ①
    </application>
</pre>

<br/><br/>

■■■■プログラムで取り出す■■■■

<br/>
プログラムの中で使うには
・ApplicationInfoのインスタンスを取り出し、<br/>
・metaData.getStringメソッドに名前を渡し、データをとりだします<br/><br/>


<pr>
ApplicationInfo  info = null;
try {
    info = getPackageManager().getApplicationInfo(
                                          getPackageName(), PackageManager.GET_META_DATA);
}   catch (NameNotFoundException e) {
}
String s = info.metaData.getString("namae")       //sの内容は"data"
</pre>





にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

Android LinearLayout weight

目次へ



LinearLayoutのweightを使うと全体の大きさに合わせて重みづけを指定することができます


■■■■layoutのxmlでweightを指定する■■■■


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout                                   ①
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/back" />

        <EditText
            android:id="@+id/editText1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" >             ②
            <requestFocus />
        </EditText>

        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="★" />
        
    </LinearLayout>

    <WebView
        android:id="@+id/webView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>



①で、orientationを指定していないのでこのLinearLayoutはhorizontalが指定されていることになり、ボタンとエディットテキストとボタンの3つのViewが横に並びます。
weightを指定しているのはエディットテキストだけなので( ② )、ボタンを2つ作った残りのサイズはすべてエディットテキストとなります。

もし、3つともweightを1,1,1と指定すれば、同じ大きさになり、
また、weightを1,2,1と指定すれば、2と指定されたものだけが2倍の大きさになります。




にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村