2014年7月3日木曜日

Android : Android Studio で Admob を使用し広告を表示できるようにする


このエントリーをはてなブックマークに追加

ライブラリの追加 : build.gradle

builde.gradle の dependencies に play-services への依存を追加します。
AdMob は Play Services の一部になっています。
(以下の例の、play-services 以外はプロジェクトのデフォルトで設定されていたものです。)

dependencies {
    compile 'com.android.support:support-v13:19.+'
    compile 'com.android.support:support-v4:19.+'
    compile 'com.google.android.gms:play-services:+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

追加後、Sync Project With Gradle ボタンを押します。


以降は、Google Mobile Ads SDK - スタートガイドに沿って AndroidManifest.xml の設定を行い、バナー広告1 に進み AdView の追加と広告のリクエストを行えば広告が表示できます。
AdView の API リファレンスはこちら。
以下、必要な事を簡単にまとめておきます。


AndroidManifest.xml

INTERNET と ACCESS_NETWORK_STATE のパーミッションを manifest タグ下に、
meta-data を application タグ下に、
AdActivity を application タグ下に、
それぞれ追加します。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.addmob" >

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <meta-data android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version"/>
        <activity
            android:name="com.example.addmob.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.google.android.gms.ads.AdActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
    </application>
</manifest>


AdView の追加と広告の表示

xml で AdView のレイアウトを追加する場合は以下の様な形式になります。
UNIT_ID は AdMob のページで作成した ID です。(ca-app-pub-XXXX....)
<com.google.android.gms.ads.AdView
        xmlns:ads="http://schemas.android.com/apk/res-auto"
        android:id="@+id/adView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        ads:adUnitId="UNIT_ID"
        ads:adSize="BANNER"/>

AdView を加えただけでは広告は表示されないので、コード中で広告をリクエストする必要があります。

AdView mAdView;
...
mAdView = (AdView)findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);

また、AdView の処理の中断と再開、終了をきちんとおこなうため、Activity(Fragment) の onPause, onResume, onDestroy で AdView の pause, resume, destroy も呼んでおきます。

@Override
protected void onResume() {
    super.onResume();
    mAdView.resume();
}

@Override
protected void onPause() {
    mAdView.pause();
    super.onPause();
}

@Override
protected void onDestroy() {
    mAdView.destroy();
    super.onDestroy();
}

2014年7月2日水曜日

Android : メールを送る Intent


このエントリーをはてなブックマークに追加
色々方法はあるようですが、Stack Overflow : Send Email Intent によると下記の方法が安定して動くようです。

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
                            "mailto", "abc@gmail.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "SUBJECT");
emailIntent.putExtra(Intent.EXTRA_TEXT, "TEXT BODY");
startActivity(Intent.createChooser(emailIntent, "Send email..."));

Android : PreferenceFragment (PreferenceScreen) にボタンを追加する


このエントリーをはてなブックマークに追加
参考 : How to add a button to a PreferenceScreen (Android)

ボタンそのものを追加というよりも、ボタンのように、押したら決められた動作(例えばダイアログを開いたり、メールを開くための Intent を飛ばす)を行う項目の追加ですが。

xml 中に Preference を作成して、PreferenceFragment で addPreferencesFromResource を行った後、findPreference でその Preference を取得して OnPreferenceClickListner を登録、という流れで行います。

<Preference android:title="Acts like a button"
            android:key="@string/button_pref_key"
            android:summary="This will act like a button"/>

Preference button = findPreference(getString(R.string.pref_button_key));
button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
    @Override
    public boolean onPreferenceClick(Preference pref) { 
        // ここでやりたいことをやる。
        return true;
    }
});

2014年7月1日火曜日

Android : PreferenceFragment で Preference の変更内容を summary に反映させる


このエントリーをはてなブックマークに追加
参考 : Android Preference の summary を動的に変更

SharedPreferences.OnSharedPreferenceChangeListener で Preference の変更を検知し、
そこで渡された key から、 findPreference(key) で Preference を、
sharedPreferences.getXXX(key, default_value) から値を取得する。
setSummary(summary) などで表示を更新する。
public class SettingFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener{

    public SettingFragment() {
        
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.setting);
    }

    @Override
    public void onResume() {
        super.onResume();
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

        Preference p = findPreference("TEST_PREFERENCE_STRING_KEY");
        String value = PreferenceManager.getDefaultSharedPreferences(getActivity()).getString("TEST_PREFERENCE_STRING_KEY", "default_value");
        p.setSummary(value);
    }

    @Override
    public void onPause() {
        super.onPause();
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        Log.i("onSharedPreferenceChanged", key);
        if(key.equals("TEST_PREFERENCE_STRING_KEY")){
            Preference p = findPreference(key);
            String value = sharedPreferences.getString(key, "default_value");
            p.setSummary(value);
        }
    }
}

Android : Fragment で menu を追加する


このエントリーをはてなブックマークに追加
Fragment の onCreate() 内で setHasOptionsMenu(true); を呼び、
onCreateOptionsMenu 内で追加したいメニューのリソースを inflate する。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.fragment_menu, menu);
}

Android : ListPreference.OnDialogClosed で NullPointerException


このエントリーをはてなブックマークに追加
参考 : PreferenceActivity gives a NullPointerException when option selected from ListPreference
(PreferenceActivity でも PreferenceActivity でも同じです。)

ListPreference に設定する android:entryValues に integer-array を設定していると
エラーが発生します。
entry も entryValues も両方 string-array である必要があります。

entryValues で string 以外が使えるようにしてほしい、という要望はかなり前から上がっていますが、対応はされていないようです。
Issue 2096: Expand ListPreference to support alternate array types

Android : リソース id を文字列変数から取得する、コード上で生成する、xml で生成する


このエントリーをはてなブックマークに追加

文字列からの取得

Resources クラスの getIdentifier メソッドを使います。
リソース id の文字列と、種類(id, string, drawable 等) を入力に、id を返します。
int id = getResources().getIdentifier(
String.format("test_id_%d", 0), "id", getActivity().getPackageName());

コード上で生成

API Level 17 (Android4.2) 以上限定。
int viewId = View.generateViewId();

xml リソースで生成

<resources> タグの中で <item> タグに type="id" を指定した項目を作成します。
strings.xml 等の中に作っても良いのですが、
res/values/ids.xml のように別ファイルにしておいた方が管理しやすいと思います。
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="test_id_0" type="id"/>
    <item name="test_id_1" type="id"/>
</resources>