2013年1月31日木曜日

広告実装-01


広告を表示させてみましょう。

広告表示というと、

●レイアウトが崩れる
●画面が見にくい
●ユーザーからクレームが来る

と、マイナスなイメージを
もたれるかもしれません。
レビューで★の評価が低いとインストール数や
ランキングの順位に大きく影響を及ぼします。

だがしかし、メリットもありまして、

●ユーザーが広告をクリックすると報酬を得られる
●報酬が得られると、より良いものを作るやる気が上がる
●やる気が上がり、どんどん新しいことに挑戦するようになる

より多くの報酬を得るために、
既存の改良あるいは新規開発を
質・量共にこなすようになり、技術力が向上する。

広告を実装する事によって、この開発者にとって最高のサイクルを体験できます。

収入が欲しくて、広告を実装するのではけしてありません。
技術者として新たな技術を欲するがために広告を実装するのです。

理解できましたか??



そして、広告にもいろいろな種類がありますが、
今回はクリック報酬型の広告について説明いたします。

有名どころは

■AdMob

http://www.google.com/ads/admob/

メリット
●Googleのアカウントで登録できる
●海外では海外用の広告が表示される
●Paypalが使える
●広告のカスタマイズ

デメリット
●銀行振り込み手数料高い
 *PayPalを使えば手数料なし?
●ドル表記なので、収入の計算が面倒!!

特徴
報酬はドルです。
円安になると、そのぶんクリック報酬が高くなります。

個人的には一番使えると思っております。
実装も簡単です。
また、広告のカスタマイズによって、アプリ内に
違和感なく広告を表示できるので、クリック率を
高められます。


■adlantis

http://www.adlantis.jp/

メリット
●登録簡単
●通帳に振り込みされる
●ゲーム広告が多い

デメリット
●国内向けの配信のみ

特徴
Greeの広告が多いため、
ゲームアプリだと、クリック率が高くなると個人的に感じています。
振り込みは5000円からです。
たまにキャンペーンを行っています。
*ランキング○○位以内で○○円みたいなキャンペーンです。

国内向けのアプリのみこちらの広告を使用するのはオススメです。
Admobと比べると収入が画面に表示されている金額そのまま
通帳に振り込まれるので、収入管理が容易です。

2013年1月25日金曜日

ダイアログで複数のエディットテキスト(テキストボックス)を表示したい!!(EditText)


前から、うすうす気づいていたのですが、
なんと、Androi4以降のライブラリーでは、
showDialogメソッドが非推奨になっておりました。

うわぁー。。

Android5.0から、復活することを少し願いつつ、
Fragmentも徐々に勉強しないといけないかも。。。

という不安を背負いながら、
今回もダイアログ処理についてです。

複数の入力式のテキストボックスをダイアログに
表示させる方法を説明いたします。

ログインIDとパスワードの設定画面などを、
別Activityを作らずに、サクッと処理したいときに
お勧めです。

~エディットテキスト使い方

■生成
EditText editText = new EditText(getApplicationContext());

生成は他のアプリと同じような感じです。

■文字列取得
String sText = editText.getText().toString();

テキストボックスに入力された文字を文字列として、
取得する方法です。

■ボックス内の設定
editText1.setInputType( InputType.TYPE_CLASS_TEXT );

setInputTypeで設定できます。
InputType.TYPE_CLASS_TEXTは
テキストボックス内での改行禁止とする設定です。

■サンプルソース

package com.example.edittext;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.InputType;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class FullscreenActivity extends Activity  implements OnClickListener{

private EditText editText1;
private EditText editText2;
private String   sBefLogin;
    private String   sBefPswd;

  private final static int WC=LinearLayout.LayoutParams.WRAP_CONTENT;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
        //レイアウトの生成
        LinearLayout layout=new LinearLayout(this);
        //上から下にオブジェクトを配置するよう設定
        layout.setOrientation(LinearLayout.VERTICAL);
        //画面表示の設定
        setContentView(layout);            
//ボタンを画面に追加する
layout.addView(makeButton("ダイアログ", 0));
}

@Override
protected Dialog onCreateDialog(int id) {
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
switch (id) {
case 0:
//エディットテキストの生成
editText1 = new EditText(getApplicationContext());
editText2 = new EditText(getApplicationContext());

//外枠とパーツの作成
LinearLayout layout = new LinearLayout(getApplicationContext());
//上から下にパーツを組み込む設定
layout.setOrientation(LinearLayout.VERTICAL);

//外枠にパーツを組み込む
layout.addView(make_TextView("ログイン"), new LinearLayout.LayoutParams( 300, 40));
layout.addView(editText1, new LinearLayout.LayoutParams( 300,70));
layout.addView(make_TextView("パスワード"), new LinearLayout.LayoutParams( 300, 40));
layout.addView(editText2, new LinearLayout.LayoutParams( 300,70));

//レイアウトをダイアログに設定
dialog.setView(layout);

//タイトルの設定
dialog.setTitle("タイトル");

//エディットボックスの入力タイプの設定
editText1.setInputType( InputType.TYPE_CLASS_TEXT );
editText2.setInputType( InputType.TYPE_CLASS_TEXT |                    InputType.TYPE_TEXT_VARIATION_PASSWORD);

//過去の入力内容が表示されるようにする
editText1.setText(sBefLogin);
editText2.setText(sBefPswd);

// dialogOKボタン
dialog.setPositiveButton("OK",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
sBefLogin= editText1.getText().toString();
sBefPswd = editText2.getText().toString();
Toast.makeText(getApplicationContext(), editText1.getText().toString(),                Toast.LENGTH_SHORT).show();
     // ダイアログを消す
removeDialog(0);
                }
            });
// dialogキャンセルボタン
            dialog.setNegativeButton("キャンセル",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
                }
            });
break;
        }
  return dialog.create();
    }

    //ボタンを作成します
    private Button makeButton(String sText,int id) {
        Button button=new Button(this);
        //ボタンの表示テキストの設定
        button.setText(sText);
        //ボタンのIDの割り振り
        button.setId(id);
        //クリックリスナーの実装
        button.setOnClickListener(this);
        //ボタンの表示方法の設定
        button.setLayoutParams(new LinearLayout.LayoutParams(WC,WC));
        return button;
    }

    private TextView make_TextView(String sMessage){
//テキストビューの生成
TextView tv = new TextView(getApplicationContext());
//メッセージの設定
tv.setText(sMessage);
return tv;
}

@Override
public void onClick(View arg0) {
//ダイアログの出現
showDialog(0);
}
}

■実行結果
1.初期表示


2,ボタン押下後






パスワードの表示を見ると
●●になっていますね。

なんか、パスワードっぽい感じで。

//外枠とパーツの作成

LinearLayout layout = new LinearLayout(getApplicationContext());



EditTextにこのレイアウト(layout)を設定するイメージです



Activityをわざわざ生成しなくてもいい、
ダイアログは本当に便利ですね。

ついでにですが、removeDialogをすることで、
Dialogふだけでなく、editTextも初期化されます。

2013年1月22日火曜日

WebViewでFLASH表示できない!!(android:hardwareAccelerated)


WebViewでFlashを表示しているアプリに
ある日「Flashが表示されない!!」という報告を受けました。

私は
「どうせ、端末にFlashがインストールされていないんだろう!!」
「目を開くことでも、忘れているんだろう!!」

と、気持ち愚痴りながら、
問題の端末で試したところ。



ご報告通りでした。
まったく、画面が表示されていません



いやいや、本当になんでだろう??

プラグインが必要なのか?
WebViewの生成時の引数に問題があるのか?


いろいろと調査した結果。

。。。。。。
。。。。。。

manifestファイルに

android:hardwareAccelerated = "true"

を追記したら、上手く動きました。

また、android:hardwareAccelerated
はAndroid2.3では非対応だったので、
ビルドのVersionをAndroid3.1にして、
問題解決!!いたしました。


ビルドのVersionUPしたことによる問題も懸念されますが。。。。。。

2013年1月16日水曜日

アプリ内の情報を保存する(PreferenceManager, SharedPreferences)


アプリ内で情報を保存する方法として、

SQLiteのDBに保存
端末に保存
Webサーバーにポストして保存
等々

いろいろありますが、
今回は端末内に情報を保存する
PreferenceManagerを紹介します。

Preferenceは端末内にxmlファイルを作成して、
そのxmlファイルを読み書きすることで、
保存データの読み書きを行っております。

Preferenceはプリファレンスと言われているらしいです。
自分は心の中で、プレファレンスと呼んでしました。。。

それはおいといて、


使い方はiPhoneアプリと同じような方法で、
キーとアイテムを紐づける
Dictionayのような使い方をします。

また、使用方法として、下記の3点があります。

1.初期設定のxmlファイルを使う方法
2.xmlファイルを自分の好きなファイル名で保存する方法
3.Activityごとに作成する方法

2.3の方法だと、他のアプリからの読み書きを許可したりすることが、
でき利便性に優れてますが、とりあえずは使用頻度の高い3の方法を紹介します。


■保存する
public static void Set_Save(String sKey,String value ,Context mCon){
    SharedPreferences shPref = PreferenceManager.getDefaultSharedPreferences(mCon);
    Editor ed = shPref.edit();
    ed.putString(sKey, value);
    ed.commit();
}

このような関数を作成すれば、だいたい完成です。

sKeyというのが、保存データの主キーです。
Contextはメインアクティビティーから、getApplicationContext()を
渡しましょう。

関数内の流れとしては、プリファレンスを生成して、プリファレンスにエディッターを通して、
キーとアイテムを保存するイメージですかね。

また、putStringは数値型だとputIntのように型によって、変わります。
putFloat, putLong, putBoolean
等々あるらしいです。

■保存内容を取得
public static String Get_Save(String sKey,Context mCon){
    SharedPreferences shPref = PreferenceManager.getDefaultSharedPreferences(mCon);
    return shPreferences.getString(sKey, "");
}


こちらもgetStringが型により変わりますので、
ご注意を
(getInt, getFloat, getLong, getBoolean等々)

また。get~でキーが見つからない場合には、
空の値が返ってきます。NULLではないです。

■保存しているかの確認
public static Boolean Chk_Save(String sKey,Context mCon){
    SharedPreferences shPref = PreferenceManager.getDefaultSharedPreferences(mCon);
    return shPreferences.getBoolean(sKey, false);
}

キーで作成したデータが存在するかを確認する関数です。
個人的には特に使う必要はないと思っていますが、
よかったら覚えておいてください。



■2.の方法を紹介
SharedPreferences sShPrefName = getSharedPreferences("好きなファイル名", MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE);

getSharedPreferencesの第一引数には保存するファイル名で第二引数はファイルアクセス許可を記述します。

MODE_WORLD_WRITEABLE  他のアプリからの書き込みOK
MODE_WORLD_READABLE   他のアプリからの読み込みOK
MODE_PRIVATE         作成したアプリからのみアクセスOK

上のソースは他のアプリからの読み書きを許可しています。
生成した後の使い方は3.と同じです。

■3.の方法を紹介
SharedPreferences sShPrefClass = getPreferences(MODE_PRIVATE); 

生成後は上記に同じです。


以上になります。

がんばって、Sharedpreferenceについて紹介いたしましたが、
端末内に保存する情報は消えるリスクが高いので、(水没、紛失、意図的)
大事な情報はサーバーで管理しましょうね。

2013年1月14日月曜日

Contextとは(getApplicationContext(),Activity,getApplication)


トーストやボタンやラベル生成時、intentの際にもに用いる

getApplicationContext()
getApplication()
this

①Toast.makeText(getApplicationContext(), aItems[result_item], Toast.LENGTH_LONG).show();
②Button button = new Button(getApplication());
③Intent intent = new Intent(this, SubActivity.class);  

自分が過去に紹介したソースでも
上記のように使用しております。

使いわけをしているかと言われると。。。。


特にしていなくてですね。。。


過去ソースを見ても、
見事に3つをランダムに万遍なく用いています。。。。。
JAVAのランダム係数よりも見事なランダム具合!!


気持ちはgetApplicationContext()を使おうとは思っているのですが。。
そんなことは有りませんでした。。


そこで、Contextについて調べたところ、

Contextを用いると、アプリの外部情報を参照できるようです。

パーミッションやResフォルダー内の画像などのリソース
リリース情報などなど。。。

参照元はこちら
http://developer.android.com/intl/ja/reference/android/content/Context.html


あっ、英語のサイトなので、

英語がわからない人には難しいですので、
気を付けてください。

ついでにですが、
自分はGoogleの翻訳機能を使っています。
英語はわかりません。


これだけではよくわからないので、

"Context getApplicationContext  Actiityどっち"

とGoogleで検索させていただき、いろいろなサイトを見たところ。。。。。


うーん。よくわからないのです。

Contextの引数は情報が多すぎてメモリーリークを引き起こす事が
よくあるらしいです。。
それを防止するためにも引数は必要最低現の情報のみ渡すべき。と

thisはそのプロジェクト情報
getApplicationContext()はそこのActivity情報
という認識です。


で、結局上記の3つどのような場面でどれを選ぶのが適切なのか?



ちょっと、わかりませんでした。。。

いや、恥ずかしい。。


とりあえず、どれでもよさそうなので、
情報量が少ない
getApplicationContext()

を使っていこうと思います。


文字列長いし
難しそうだし


共有①
・RadioButton生成時にgetAppliationContext()を渡したら、setTextで渡した文字列が
画面に表示されなかった。getTextすると文字列をしゅとくできたけど。。。。

2013年1月10日木曜日

選択型ダイアログ(setSingleChoiceItems)


ダイアログの作成の応用といいますか、
他のタイプのダイアログとの併用の仕方に
ついて、紹介いたします。

とりあえず、サンプルのソースはこちら

package com.example.dialog;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;
import android.app.Activity;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;


public class MainActivity extends Activity implements OnClickListener{
    //選択結果を保存す
    private int result_item = 0;
    //選択欄の配列
    private String[] aItems = {"りんご","バナナ","マンゴー"};
    //レイアウトの定数を変数に格納
    private final static int WC=LinearLayout.LayoutParams.WRAP_CONTENT;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //レイアウトの生成
        LinearLayout layout=new LinearLayout(this);
        //上から下にオブジェクトを配置するよう設定
        layout.setOrientation(LinearLayout.VERTICAL);
        //画面表示の設定
        setContentView(layout);            
        
        //ボタンを作成します(押下すると普通のダイアログ出現)
  //ボタンを画面に追加する
  layout.addView(makeButton("普通のダイアログ", 0));
  layout.addView(makeButton("選択型のダイアログ", 1));
    }

    //ボタンを作成します
    private Button makeButton(String sText,int id) {
        Button button=new Button(this);
        //ボタンの表示テキストの設定
        button.setText(sText);
        //ボタンのIDの割り振り
        button.setId(id);
        //クリックリスナーの実装
        button.setOnClickListener(this);
        //ボタンの表示方法の設定
        button.setLayoutParams(new LinearLayout.LayoutParams(WC,WC));
        return button;
    }
    
    //クリック時に呼ばれるよ
    public void onClick(View view) {
        //押下されたダイアログのIDを取得
        showDialog(view.getId());
    }
    
    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
            case 0:
                return CreateDialog("タイトル", "メッセージ", id);
            case 1:
                return CreateDialog("選択型", null, id);
            default:
                return null;
       }
    }

    private Dialog CreateDialog(String titleId, String messageId, int id) {
        //アラートダイアログを生成
        AlertDialog.Builder dialog = new AlertDialog.Builder(this);
        //ダイアログにタイトルを設定
        dialog.setTitle(titleId);
        //nullの時は本文を表示しない対応
        if (messageId != null)dialog.setMessage(messageId);
        dialog.setIcon(R.drawable.icon);
        switch (id) {
        case 0:
            // dialogOKボタン
            dialog.setPositiveButton("OK",new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    removeDialog(0);
                }
            });
            // dialogキャンセルボタン
            dialog.setNegativeButton("キャンセル",new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });
            break;
        case 1:
            //選択型ダイアログ
            dialog.setSingleChoiceItems(aItems, result_item, new DialogInterface.OnClickListener(){
    public void onClick(DialogInterface dialog, int which) {
                    result_item = which;
                }
            });
            //OKボタン押下時
            dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichid) {
                  Toast.makeText(getApplicationContext(), aItems[result_item], Toast.LENGTH_LONG).show();
                    }
});
            break;
        default:
}
        return dialog.create();
    }
}


実行結果は

普通のダイアログボタンを押下すると


選択型のダイアログボタンを押下すると


OKボタン押下後は


のようになります。

押下するボタンにあわせて
出現させるダイアログを変更させています。

また、選択型ダイアログとは
複数の項目から、1つのアイテムをチェックする
ダイアログの事です。

何か、もっとわかりやくて、世間に浸透している名称
とか、あるのでしょうか??

チェックボックス型でもないし。。。


何かご存じの方はお手数ですがご連絡ください。



本題にもどすと、
showDialogの作成方法は前回の通りで、
違いは、
if (messageId != null)dialog.setMessage(messageId);
です。

ダイアログの本文に表示するテキストがない場合には、
本文に表示しないようにしております。

選択型のダイアログは本文があると、うまく表示できないので、
このような措置を取っております。

dialog.setSingleChoiceItems(aItems, result_item,new DialogInterface.OnClickListener(){

第1引数が表示するアイテムリストで、
第2引数が初期に選択されるアイテムです。

最後に選択したアイテムを初期表示にすることにより、
ユーザーが以前何を選択していたのかをわかるようにしています。


以上です。


簡単に作れるダイアログ特集でした。

2013年1月9日水曜日

ビルド時のAndroidバージョン変更(Project Build Target)

Android開発時にビルドする
Versionを変更したくなることはありませんか??

たとえば、Android2.2から、利用できるようになった関数を使うために、
現状のAndroid1.6から、VersionUPしたいとか。。。。


そんなときは

変更したいプロジェクトで
[右クリック]→[ビルド・パス]→[ビルド・パスの構成]






左側のリストから
[Android]→[対象のVersionにチェック]→[適用]




以上で、完了です。



これで,ビルド時のターゲットを変更できます。





2013年1月8日火曜日

ダイアログの表示(shwDialog, CreateDialog)

今回はshowDialogを使ったダイアログの表示を
行いたいと思います。

showDialogで作成したダイアログはタスク管理を
全て任せるので、アプリ落ちしにくくしてくれます。

■サンプル
package com.example.dialog;

import android.os.Bundle;
import android.app.Activity;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;


public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //ダイアログを呼ぶ
        showDialog(0);
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
            case 0:
                return CreateDialog("タイトル", "メッセージ", id);
            default:
                return null;
        }
    }
 
    private Dialog CreateDialog(String titleId, String messageId, int id) {
        AlertDialog.Builder dialog = new AlertDialog.Builder(this);
        // タイトルの設定
        dialog.setTitle(titleId);
        // 本文の設定
        dialog.setMessage(messageId);
        // アイコンの設定
        dialog.setIcon(R.drawable.icon);
        //idごとに処理を分岐
        switch (id) {
            case 0:
                // dialogOKボタン
                dialog.setPositiveButton("OK",new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        removeDialog(0);
                    }
                });
                // dialogキャンセルボタン
               dialog.setNegativeButton("キャンセル",new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int which) {
                       dialog.cancel();
                   }
               });
               break;
           default:
        }
        return dialog.create();
    }
}

こんな感じで出来上がります。


タイトルの横にあるの画像はアプリのiconをイメージしています。
アプリのiconも表示することにより、ユーザーはダイアログの表示が開発者が意図したものか、 エラーで端末が出現させたものか区別することができます。
removeDialog(0)とあるのですが、 これは出現しているダイアログを消す関数です。 EditTextやチェックを初期化したいときに用いましょう。
引数に消したいidを指定してください。


removeDialogはとりあえず、とても大切です。

はい。




自分はダイアログが好きです。 簡単に作れるし、Activityを増やさなくていいので。。。 いろいろとおしゃれに作る方法とかもありますので、別途案内していきたいです。


今回のサンプルソース内のshowDialogの引数の数値を変えて、 いろいろなダイアログを作成してみて下さい。

2013年1月7日月曜日

アプリの保存先(installLocation)

スマホのメモリがいっぱいになった時、あなたはどのメモリを消しますか??

使っていないアプリやバックアップした写真。。。。。。

まぁ、いろいろあると思いますが、
私個人は容量の重いアプリを消します。

いろいろなアプリを見るために使わないアプリがたくさんインストールされています。
使わないアプリだらけだと、どれを消すか迷います。
そういう時は、とりあえず容量の大きいアプリをサクッとアンインストールします。


前置きが長くなりましたが、そんなことをされないようにするために、
せっかくインストールされたアプリをユーザーの手からまもるために、

今回はアプリの保存先をSDカードに指定する方法について共有いたします。


Android2.2から、アプリの保存先を指定できるようになりました。


やり方は簡単

manifest.xmlに

android:installLocation="preferExternal"


上記を記述するだけで、SDカードにインストールされます。
<manifest タグ内に記述して下さい


■android:installLocationについて

android:installLocation="internalOnly"
内部メモリーに保存されます。

android:installLocation="auto"
内部メモリーに保存するか、外部に保存するか自動的に決まります
ユーザー自身で内部と外部への移動が可能です。

android:installLocation="preferExternal"
外部メモリーに保存します。
ユーザー自身で内部と外部への移動が可能です。
*外部メモリーがいっぱいだと、内部メモリーに保存されます。



ウィジェットやアラームみたいな常駐アプリだと外部メモリへの保存は推奨されていません。
外部メモリに保存すると、
外部メディア(USB等)と接続時に、マウントされてしまいアプリが利用できなくなってしまいます。


外部メモリーに保存することが適切なアプリと不適切なアプリが
ありますので、そこらへんはご調整のほど、よろしくお願いいたします。