Android SDK

このトピックでは、Android アプリ (Android NDK アプリを含む) での Critercism の使い方を説明します。

Note

初めてCrittercismをご利用になる場合は、まず Crittercism クイックスタート をご覧ください。 Crittercism SDK は、最初に無料の Crittercism アカウントにサインアップし、アプリを登録し (必要な場合)、アプリのプラットフォームの Crittercism SDK をダウンロードしなければインストールできません。 ダウンロードしたバージョンに関しては、 Release Notes を参照してください。

SDK のインストール

Maven からのインストール

pom.xml の <dependencies>...</dependencies> タグの間に以下を追加します。

<dependency>
  <groupId>com.crittercism</groupId>
  <artifactId>crittercism-android-agent</artifactId>
  <version>LATEST</version>
</dependency>

あるいは NDK エージェントの場合には以下を追加します。

<dependency>
  <groupId>com.crittercism</groupId>
  <artifactId>crittercism-android-ndk-agent</artifactId>
  <version>LATEST</version>
</dependency>

Gradle からのインストール

build.gradle ファイル (projectname/app ディレクトリ内) で、 dependencies{...} に Crittercism 依存性情報を追加します。

compile 'com.crittercism:crittercism-android-agent:+'

あるいは NDK エージェントの場合には以下を追加します。

compile 'com.crittercism:crittercism-android-ndk-agent:+'

これを追加した後は、gradle ファイルを必ずプロジェクトと同期させてください!

手動インストール

1.Crittercism JAR ファイルを libs フォルダーにコピーします。 2.Eclipse をお使いの場合は、プロジェクトを右クリックし、[Properties (プロパティ)] をクリックして [Java Build Path (Java ビルド パス)] を選択し、[ Add External Jar (外部 Jar の追加) ] をクリックしてから Crittercism JAR ファイルを追加します。

Manifest のセットアップ

アプリの AndroidManifest.xml ファイルに次のパーミッションを追加します。

INTERNET
必須 です。 データを Crittercism にレポートするのに使用します。
ACCESS_NETWORK_STATE
オプション です。キャリア やネットワーク タイプといったネットワーク接続情報を提供できます。
GET_TASKS
オプション です。クラッシュ時に実行していたアクティビティに関する情報のクラッシュ・レポートを増強できます。
<?xml version="1.0" encoding="UTF-8"?>
<manifest android:versionCode="3"
    android:versionName="1.0"
    package="com.crittercism.demo"
    xmlns:android="http://schemas.android.com/apk/res/android">

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

    <application android:icon="@drawable/icon"
        android:label="@string/app_name" android:name=".DemoApp">

        <activity android:label="@string/app_name" android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

    </application>
</manifest>

これらパーミッションに関する詳細については、 Android Manifest のドキュメンテーション を参照してください。

Crittercism の初期化

初期化 とは、Crittercism と通信するためにアプリを編集するプロセスです。

  1. このインポートと初期化は、コード内で一度だけ追加します。メイン アクティビティ (android.intent.action.MAIN インテント フィルタと同じアクティビティ) のトップに次のインポートを追加します。
import com.crittercism.app.Crittercism;
  1. onCreate アクティビティの始めのメイン スレッドで Crittercism を初期化します。
Crittercism.initialize(getApplicationContext(), "CRITTERCISM_APP_ID");
  1. Android アプリを構築します。

これで Android アプリが Crittercism と統合されました。他の機能を使用するには、プロジェクトにさらにコードを追加する必要があります。

Proguard シンボリケーションの設定

デバッグ シンボルが削除されているアプリの場合、 シンボリケーション とはシンボルをマッピングしてスタック トレースを人間が読める形態に翻訳することを言います。 Crittercism では、自動的なサーバー側のシンボリケーションを提供しており、ユーザーがアプリのシンボル ファイルを提供する必要があります。

Note

本セクションに記載されている手順は、アプリを Android Proguard を使って難読化する場合にのみ従ってください。 そうでない場合には、本セクションは無視してください。

Android アプリケーションの場合、開発者には ProGuard ツールを使って関数名を難読化し、アプリ サイズを小さくして他者がアプリ ソースをリバース エンジニアリングできないようにするというオプションがあります。難読化された名前を人間が読める名前に置き換えるため、開発者は Proguard マッピング ファイルを使用します。

ProGuard のセットアップ

1.Crittercism を使ってプロジェクトを構築するには、Crittercism JAR をプロジェクトの libs/ ディレクトリ内に配置します。

2.プロジェクトの proguard.cfg ファイルに次の行を追加します。

-keep public class com.crittercism.**
-keepclassmembers public class com.crittercism.*
{
    *;
}

3.行番号情報をを取得するには、ファイル名と行番号を必ず ProGuard .cfg 設定ファイル内に維持してください。

-keepattributes SourceFile, LineNumberTable

この情報は、シンボリケーションされていないものまですべてのスタックトレースで見えるようになります。

mapping.txt ファイルのアップロード

クラッシュが自動的にシンボリケーションされるようにするには、 mapping.txt ファイルを [App Settings (アプリの設定)] ページでアップロードする必要があります。

アップロードする各 mapping.txt ファイルは、アプリのバージョンに関連付けられます。各 mapping.txt ファイルは、1 つのバージョンのみに対するクラッシュをシンボリケーションします。

Note

バージョンに合った正しいファイルをアップロードするように注意してください! 誤ったファイルをアップロードすると、 違うスタックトレースが取得されることがあります。 誤ってバージョンに合っていない mapping.txt をアップロードしてしまった場合には、 そのファイルを削除してもう一度正しいファイルをアップロードしてください。

次のコマンドを使用して Crittercism サーバーに Proguard マッピング ファイルをアップロードします。

構文

curl "https://app.crittercism.com/api_beta/proguard/<app_id>" -F proguard=@"<path/to/proguard-mapping.txt>" -F app_version="app-version-name" -F key=<key>

Note

Specify the “@” symbol when using this command.

引数

名前 説明
app_id アプリケーション ID。
path proguard-mapping.txt ファイルへのパス。
app-version-name アプリ バージョン名。
key キー。

戻り値

コード 意味
200 成功しました。
400 指定した proguard ファイルに問題があります。HTML 応答本文が問題を説明します。
404 アプリが見つからないか、トークンが正しくありません。

Note

CrittercismConfig インスタンス内でカスタマイズされたアプリ バージョン名を設定した場合には、その文字列を使用し app-version-name 内のマニフェスト文字列は使用しないでください。また、アプリ バージョン内にアプリ バージョン コードを含む場合には、そのコードも app-version-name に含めます。

ビルド ファイルへのコマンドの追加

ビルド ファイルに別のステップを挿入すると次の例に基づいてコマンドが実行できます。詳細については、Crittercism API ドキュメントを参照してください。

curl "https://app.crittercism.com/api_beta/proguard/<app_id>" -F proguard=@"<path/to/proguard-mapping.txt>" -F
app_version="app-version-name" -F key=<key>

Crittercism は Jenkins (人気のあるビルド システム) のプラグインを提供しており、Jenkins が作成した シンボル ファイルを自動的にアップロードします。

Note

この時点で、Crittercism はアプリケーションからアプリケーション パフォーマンス情報を受信できるようになっており、ビルド環境は Crittercism に自動的にシンボル ファイルを提供するようにセットアップされています。

Android NDK シンボリケーションの設定

デバッグ シンボルが削除されているアプリの場合、 シンボリケーション とはシンボルをマッピングしてスタック トレースを人間が読める形態に翻訳することを言います。 Crittercism では、自動的なサーバー側のシンボリケーションを提供しており、ユーザーがアプリのシンボル ファイルを提供する必要があります。

Note

本セクションの手順は、Android NDK アプリがあり、NDK クラッシュ レポートが有効になっている場合にのみ従ってください。 そうでない場合には、本セクションは無視してください。

NDK クラッシュ レポートを使用する Android NDK アプリケーションの場合、開発者は デバッグ文字を含むシンボル (.so) ファイルをアップロードしてスタック トレースを読むことができるテキストに変換することができます。

コンソールを使ったシンボルのアップロード

シンボルは、コンソールやターミナルを使ってアップロードできます。[App Settings (アプリ設定)] の [ Upload NDK Symbols (NDK シンボルのアップロード) ] タブの下に表示されるアプリの設定ページを参照してください。

  1. ルート アプリケーション ディレクトリに移動します。
  2. Android プロジェクトで obj ディレクトリを zip で圧縮します。
  3. zip アーカイブをドロップ ボックス ([App Settings (アプリ設定)] の [ Upload NDK Symbols (NDK シンボルのアップロード) ] タブの下) にドラッグして NDK シンボルをアップロードします。200 OK とレポートが返ってシンボルをアップロードしたライブラリがどれか表示されるか、エラーがレポートされます。
  4. クラッシュ レポートへ移動して [ Add to Symbolication Queue (シンボリケーション キューに追加) ] をクリックします。

これらのステップを完了すると、シンボリケーションしたネイティブ クラッシュが表示できるようになります。 その後、そのビルドからのクラッシュは自動的にシンボリケーションされるようになります。

コマンドを使ったシンボルのアップロード

次のコマンドを使用して Crittercism サーバーに NDK シンボル ファイルをアップロードすることもできます。

構文

curl "https://app.crittercism.com/api_beta/ndksym/<app_id>" -F ndksym=@"<path/to/ndksym.so.zip>" -F key=<key>

Note

Specify the “@” symbol when using this command.

引数

名前 説明
app_id アプリケーション ID。
path ndksym.so.zip ファイルへのパス。
key キー。

戻り値

コード 意味
200 成功しました。
400 指定した NDK シンボル ファイルに問題があります。HTML 応答本文がファイルの問題を説明します。
404 アプリが見つからないか、トークンが正しくありません。

処理される例外のロギング

logHandledException API を使用して、必ずしもクラッシュを生じるわけではないエラー条件を追跡します。

処理される例外を使用すると、 try/catch ブロック内に閉じ込められた例外を追跡したり、第三者製の SDK をテストしたり、現在アサーションを使用している可能性のあるコード内のエリアをモニタしたりすることができます。処理される例外は、メモリ低下警告などのエラー イベントの追跡にも使用できます。詳細については、 処理される例外 を参照してください。

処理される例外は、クラッシュ レポートとほぼ同じようにスタックトレースごとにグループ分けされます。 また、Crittercism ポータルの Handled Exceptions 処理される例外 エリアで表示できます。

以下は処理される例外のロギング例です。

try {
    throw new Exception("Exception Reason");
} catch (Exception exception) {
    Crittercism.logHandledException(exception);
}

Note

処理される例外のロギングは、毎分 1 回に制限されています。直近 1 分以内に例外をログした場合には、それまでに発生した 5 回の例外をバッファし、1 分後にそれを送信します。

ユーザー メタデータのロギング

開発者は、個々のユーザーに関する情報を追跡するようにユーザーのメタデータを設定できます。 詳細については、 ユーザー メタデータ を参照してください。

ユーザー名の追加

ユーザー名を設定すると、各ユーザーのアプリ パフォーマンスがモニタできるようになります。 いったんユーザー名を設定すると、Crittercism ポータルの「Userviews (ユーザー検索)」機能Zを使用して特定のユーザーに発生したクラッシュやエラーのリストを検索できるようになります。 ユーザー名は、カスタマー サポート システムに関連付けられるような値に設定することを推奨します。

以下はユーザー名の設定例です。

Crittercism.setUsername("MommaCritter");

Note

1 から 32 文字までの文字列が有効な入力となります。

任意ユーザー メタデータの追加

各ユーザーに対し、キー/値の組み合わせの任意のメタデータを最大 10 件まで設定できます。データは、ユーザー プロファイル表示時に開発者ポータルに表示されます。

以下はメタデータと現在のユーザーとの関連付け例です。

// instantiate metadata json object
JSONObject metadata = new JSONObject();

// add arbitrary metadata
metadata.put("user_id", 123);
metadata.put("game level", "5");

// send metadata to crittercism (asynchronously)
Crittercism.setMetadata(metadata);

その他のタスク

本セクションは、その他のオプションのタスクを説明します。

クラッシュ レポートの向上

クラッシュ とは、ユーザーのセッションを終了させる予期しないイベントによって発生するランタイム例外のことを言います。 クラッシュは try/catch ブロック内では処理されません。詳細については、 クラッシュ レポート (未処理例外) を参照してください。

アプリがその前のセッションでクラッシュしたかどうかを判断するには、次のようにして非同期要求を出します。

import com.crittercism.app.Crittercism;
import com.crittercism.app.CritterCallback;
import com.crittercism.app.CritterUserData;
import com.crittercism.app.CritterUserDataRequest;

import android.os.Bundle;

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Crittercism.initialize(getApplicationContext(),
        "<CRITTERCISM_APP_ID>", crittercismConfig);
    someMethodInMyCode();
}

public void someMethodInMyCode() {
    // Instantiate callback object.
    CritterCallback cb = new CritterCallback() {
        // CritterCallback is an interface that requires you to implement
        // onCritterDataReceived(CritterUserData).
        @Override public void onCritterDataReceived(CritterUserData userData) {
            boolean crashedOnLastLoad = userData.crashedOnLastLoad();
            // ...do something with crashedOnLastLoad
        }
    };

// Instantiate data request object, and specify that it should include
// information on whether the previous app session crashed.

CritterUserDataRequest request = new CritterUserDataRequest(cb)
                                   .requestDidCrashOnLastLoad();

// Fire off the request.
request.makeRequest();
}

Note

必ず requestDidCrashOnLastLoad() を呼び出すようにしてください。これを呼び出さない場合、ログに警告が表示され、 false の値が返されます。

サービス モニタリングの設定

アプリがネットワーク呼び出しを行うと、Crittercism は必ず特定の情報を自動的にモニタし、キャプチャします。 フィルタリングや位置詳細はオプションで設定できます。詳細については、 サービス モニタリング を参照してください。

Crittercism を有効にすると、 java.net.HttpURLConnection または org.apache.http.impl.client.DefaultHttpClient のいずれかによって生成される HTTP トラフィックのパフォーマンスがモニタされます。ネットワーク パフォーマンス モニタリングをオンにするための操作は必要ありません。通常通り Crittercism を初期化するだけです。

キャプチャしたデータのフィルタリング

要求の実際の内容が検閲されることはもちろん絶対にありませんが、Crittercism ウェブ ポータルに表示したくない URL があることもあります。デフォルトでは、Crittercism に送信される前にクエリ パラメーターからはすべての URL が消去されます。たとえば、 www.yoururl.com/login?secret=foobar という URL は www.yoururl.com/login とレポートされます。この動作を回避する方法は、以下のセクションの「特定の URL に対するクエリ パラメーターの維持」を参照してください。

URL のブラックリスト

URL のブラックリスト機能を使用すると、慎重に扱うべき URL がネットワーク機器によってキャプチャされないようにすることができます。Crittercism にモニタされたくない URL に対し、 CrittercismConfiguration オブジェクトを setURLBlacklistPatterns() に使用します。この設定オプションは、Crittercism の初期化時に設定する必要があります。

setURLBlacklistPatterns() メソッドは、 String オブジェクトの List を使用してライブラリがキャプチャした URL と一致させます。URL の中に入力 String が含まれている場合、その URL は Crittercism にレポートされません。

例:

List<String> urlBlacklistPatterns = new LinkedList<String>();
urlBlacklistPatterns.add("blacklisted_url");

CrittercismConfig config = new CrittercismConfig();
config.setURLBlacklistPatterns(urlBlacklistPatterns);

Crittercism.initialize(getApplicationContext(), "<CRITTERCISM_APP_ID>", config);
特定の URL に対するクエリ パラメータの維持

上記に記述したように、URL は Crittercism に送信される前にクエリ パラメーターから消去されます。ただし、特定の URL に対してはクエリ パラメーターを維持しておく方がいいこともあります。特定の URL に対してクエリ パラメーターが消去されないようにするには、Crittercism の初期化時に CrittercismConfiguration オブジェクトを使って URL パターンのリストを提供することができます。 パターンのリストを設定するには、 setPreserveQueryStringPatterns(List<String> urlPatterns) を呼び出します。

setPreserveQueryStringPatterns() に提供されるパターンのリストは、そのパターンが URL の部分文字列かどうかをチェックして URL と照合されます。

例:

List<String> preserveQueryPatterns = new LinkedList<String>();
preserveQueryPatterns.add("mysite.com");

CrittercismConfig config = new CrittercismConfig();
config.setPreserveQueryStringPatterns(preserveQueryPatterns);

Crittercism.initialize(getApplicationContext(), "<CRITTERCISM_APP_ID>", config);

位置の更新

Crittercism パフォーマンス モニタリングでは、位置情報をネットワーク データに関連付けられるようになりました。デフォルトでは、位置情報は IP の逆引きで取得されます。ライブラリ バージョン 4.2.0 からは、 android.location.LocationManager.NETWORK_PROVIDER または android.location.LocationManager.GPS_PROVIDER によって提供されるデータで位置情報を更新するオプションがあります。これにより、さらに正確なデータをサーバーに送信できます。Android 開発者ガイドで説明されているように、ネットワークや GPS プロバイダーから位置更新情報を受信するには、 AndroidManifest.xml ファイルに ACCESS_COARSE_LOCATION または ACCESS_FINE_LOCATION パーミッションを含む必要があります。

位置情報を更新するには、次のコード例で示すように Crittercism.updateLocation(Location) 呼び出しを使用します。

import com.crittercism.app.Crittercism;

import android.content.Context;
import android.os.Bundle;

import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Crittercism.initialize(getApplicationContext(), "<CRITTERCISM_APP_ID>");
    startLocationTracking();
}

private void startLocationTracking() {
    // Based on code sample in the Android Developer Guide: Location Strategies.
    // See http://developer.android.com/guide/topics/location/strategies.html for
    // more info.

    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            // Update most recent location in Crittercism.
            Crittercism.updateLocation(location);
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {
            // Do something.
        }

        public void onProviderEnabled(String provider) {
            // Do something.
        }

        public void onProviderDisabled(String provider) {
            // Do something.
        }
    };

    // Request location updates through the GPS tracker. You can also use LocationManager.NETWORK_PROVIDER
    // to get location information from cell towers and Wifi.
    // NOTE: Don't forget to include either the ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission
    // in your AndroidManifest.xml file!!)
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
}

ユーザーに対する Crittercism からのオプトアウトの許可

Crittercism では、Crittercismへのあらゆるアプリのレポートを無効にするスタティック型のオプトアウト ステータス設定があります。 開発者は、ユーザーに Crittercism のロギングとレポートからオプトアウトするかどうかを尋ねるコードを実装し、その後ステータスを変更する setOptOutStatus を呼び出すことができます。また、 requestOptOutStatus を呼び出して現在のステータス設定を判断することもできます。詳細については、 Crittercism からのオプトアウト を参照してください。

ユーザーをオプトアウトするには、次の API 呼び出しを使用します。

boolean optOutStatus = true;
Crittercism.setOptOutStatus(optOutStatus);

また、現在のユーザーのオプトアウト ステータスを取得してユーザーが Crittercism からオプトアウトしたかどうかを判断することもできます。次のようにして非同期要求を行います。

import com.crittercism.app.Crittercism;
import com.crittercism.app.CritterCallback;
import com.crittercism.app.CritterUserData;
import com.crittercism.app.CritterUserDataRequest;

import android.os.Bundle;

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Crittercism.initialize(getApplicationContext(),
        "<CRITTERCISM_APP_ID>", crittercismConfig);
    someMethodInMyCode();
}

public void someMethodInMyCode() {
    // Instantiate callback object.
    CritterCallback cb = new CritterCallback() {
        // CritterCallback is an interface that requires you to implement
        // onCritterDataReceived(CritterUserData).
        @Override public void onCritterDataReceived(CritterUserData userData) {
            boolean isOptedOut = userData.isOptedOut();
            // ...do something with isOptedOut
        }
    };

    // Instantiate data request object, and specify that it should include
    // information on whether the has opted out.
    CritterUserDataRequest request = new CritterUserDataRequest(cb)
                                            .requestOptOutStatus();

    // Fire off the request.
    request.makeRequest();
}

Rate My App

Note

ライブラリ バージョン 3.2.0 以降でサポートされています。

Note

この機能は、API レベル 5 以上でのみ動作します。

[App Settings (アプリ設定)] で Rate App Alert (アプリ評価アラート) を有効にした場合は、Crittercism ライブラリがサーバーの指定に従って Rate My App アラートの設定を受信し、処理します。Rate My App アラートを有効にし、サーバーの設定に従って動作するようにするには、次の 2 つのステップが必要です。

  1. [Rate My App (アプリ評価)] アラート ダイアログが表示されているかどうかを確認します。

#.アラート ダイアログを作成し、表示します。

Note

ライブラリ バージョン 3.2.0 以降でサポートされています。

Important

ライブラリの UI エレメントを正しく処理するのは複雑なため、Crittercism ライブラリは実際には AlertDialog を表示しません。 onPause() イベント中のダイアログの表示やその終了は、開発者の責任で行ってください。

最初のステップ (ダイアログが表示されるかどうかの確認) を実施するには、初期化後に次のように非同期要求を行います。

import com.crittercism.app.Crittercism;
import com.crittercism.app.CritterCallback;
import com.crittercism.app.CritterUserData;
import com.crittercism.app.CritterUserDataRequest;

import android.os.Bundle;

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Crittercism.initialize(getApplicationContext(),
        "<CRITTERCISM_APP_ID>", crittercismConfig);
    someMethodInMyCode();
}

public void someMethodInMyCode() {
    // Instantiate callback object.
    CritterCallback cb = new CritterCallback() {
        // CritterCallback is an interface that requires you to implement
        // onCritterDataReceived(CritterUserData).
        @Override public void onCritterDataReceived(CritterUserData userData) {
            boolean shouldShowRateMyAppAlert = userData.shouldShowRateMyAppAlert();
            String title = userData.getRateMyAppTitle();
            String message = userData.getRateMyAppMessage();

            if (shouldShowRateMyAppAlert) {
                // ...send title and message to some code that will generate the
                // AlertDialog.
            }
        }
    };

    // Instantiate data request object, and specify that it should include
    // information for Rate My App.
    CritterUserDataRequest request = new CritterUserDataRequest(cb)
                                            .requestRateMyAppInfo();

    // Fire off the request.
    request.makeRequest();
}

requestRateMyAppInfo() を呼び出すのを忘れないようにしてください。これを忘れると、ログに複数の警告が表示され、 CritterUserData.shouldShowRateMyAppAlert() が false を返し、 CritterUserData.getRateMyAppTitle() および CritterUserData.getRateMyAppMessage() は null を返します。

AlertDialog が表示されることがわかったら、Crittercism ライブラリには Goldilocks アプローチのようなもので AlertDialog を生成する方法が 2 つ用意されています。

方法 1 (最も簡単な方法)

正しく呼び出せば、 Crittercism.generateRateMyAppAlertDialog(Context)AlertDialog インスタンスを作成し、返します。正しく呼び出されない場合には null が返されます (API 呼び出しが null を返す状況については、コード例の下にある箇条書きを参照してください)。これで Handler オブジェクトにメッセージを送信して、AlertDialog を表示できます。

import com.crittercism.app.Crittercism;
import com.crittercism.app.CritterCallback;
import com.crittercism.app.CritterUserData;
import com.crittercism.app.CritterUserDataRequest;
import com.crittercism.app.Crittercism;

import android.app.AlertDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;

static final Handler myHandler = new AlertDialogHandler();

private static class AlertDialogHandler extends Handler {
    private final static int ALERT_DIALOG_WHAT = 1;
    private AlertDialog ad = null;

public void setAlertDialog(AlertDialog ad) {
     this.ad = ad;
}

public void dismissAlertDialog() {
    ad.dismiss();
}

@Override public void handleMessage(Message msg) {
    switch (msg.what) {
        case ALERT_DIALOG_WHAT:
            // Ensure that Crittercism.generateRateMyAppAlertDialog(Context)
            // did not return null.
            if (ad != null) {
                ad.show();
            }
            break;
        default:
            break;
       }
   }
}

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Crittercism.initialize(getApplicationContext(),
        "<CRITTERCISM_APP_ID>", crittercismConfig);
    someMethodInMyCode();
}

@Override protected void onPause() {
    // Prevent window leaking by dismissing dialog.
    ((AlertDialogHandler)myHandler).dismissAlertDialog();
    super.onPause();
}

public void someMethodInMyCode() {
    // Instantiate callback object.
    CritterCallback cb = new CritterCallback() {
        // CritterCallback is an interface that requires you to implement
        // onCritterDataReceived(CritterUserData).
        @Override public void onCritterDataReceived(CritterUserData userData) {
            boolean shouldShowRateMyAppAlert = userData.shouldShowRateMyAppAlert();
            if (shouldShowRateMyAppAlert) {
                // Initialize the thread as a looper.
                Looper.prepare();

                // Generate the alert dialog.
                // IMPORTANT: you must pass in the *Activity* instance to
                // generateRateMyAppAlertDialog(Context). If you attempt to pass
                // in getApplicationContext(), the AlertDialog instance will not
                // be created properly and the method will return null.
                ((AlertDialogHandler)myHandler).setAlertDialog(
                    Crittercism.generateRateMyAppAlertDialog(MyActivity.this));
                myHandler.dispatchMessage(Message.obtain(myHandler,
                    AlertDialogHandler.ALERT_DIALOG_WHAT));

                Looper.loop();
                Looper.myLooper().quit();
            }
        }
    };

    // Instantiate data request object, and specify that it should include
    // information for Rate My App.
    CritterUserDataRequest request = new CritterUserDataRequest(cb)
                                            .requestRateMyAppInfo();

    // Fire off the request.
    request.makeRequest();
}

Note

重要:この方法では、次のような場合に null が返ります。

  • デバイスが API レベル 5 以上で動作していない。
  • サーバーで Rate App Alert が有効になっていない。
  • 呼び出しスレッドがルーパーとして初期化されていない (Looper.prepare() を呼び出していない)。
  • activityContext に有効なアクティビティ インスタンスが提供されていない。
  • ユーザーが Crittercism からオプトアウトしている。
  • アプリケーション パッケージに対する有効な課金の文字列 ("com.amazon.venezia" など) がなく、かつ CrittercismConfig.getRateMyAppTestTarget() が null である。

これらの条件いずれかが検出されると、ライブラリはログに適切な警告を出力します。AlertDialog を表示する前に、必ず null でないことを確認してください!!!

方法 2 (こちらも比較的簡単です)

Crittercism.generateRateMyAppAlertDialog(Context, String, String) は、正しく呼び出せば AlertDialog インスタンスを作成し、返します。正しく呼び出されない場合には null が返されます (API 呼び出しが null を返す状況については、コード例の下にある箇条書きを参照してください)。これで Handler オブジェクトにメッセージを送信して、AlertDialog を表示できます。この方法は、国際化に関する問題に対しては有用となることがあります。

import com.crittercism.app.Crittercism;
import com.crittercism.app.CritterCallback;
import com.crittercism.app.CritterUserData;
import com.crittercism.app.CritterUserDataRequest;
import com.crittercism.app.Crittercism;

import android.app.AlertDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;

static final Handler myHandler = new AlertDialogHandler();

private static class AlertDialogHandler extends Handler {
    private final static int ALERT_DIALOG_WHAT = 1;
    private AlertDialog ad = null;

    public void setAlertDialog(AlertDialog ad) {
        this.ad = ad;
    }

    public void dismissAlertDialog() {
        ad.dismiss();
    }

    @Override public void handleMessage(Message msg) {
        switch (msg.what) {
            case ALERT_DIALOG_WHAT:
                // Ensure that Crittercism.generateRateMyAppAlertDialog(Context, String, String)
                // did not return null.
                if (ad != null) {
                    ad.show();
                }
                break;
            default:
               break;
           }
       }

}

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Crittercism.initialize(getApplicationContext(),
        "<CRITTERCISM_APP_ID>", crittercismConfig);
    someMethodInMyCode();
}

@Override protected void onPause() {
    // Prevent window leaking by dismissing dialog.
    ((AlertDialogHandler)myHandler).dismissAlertDialog();
    super.onPause();
}

public void someMethodInMyCode() {
    // Instantiate callback object.
    CritterCallback cb = new CritterCallback() {
        // CritterCallback is an interface that requires you to implement
        // onCritterDataReceived(CritterUserData).
        @Override public void onCritterDataReceived(CritterUserData userData) {
            boolean shouldShowRateMyAppAlert = userData.shouldShowRateMyAppAlert();
            if (shouldShowRateMyAppAlert) {
                String title = userData.getRateMyAppTitle();
                String message = userData.getRateMyAppMessage();
                // Initialize the thread as a looper.
                Looper.prepare();

                // Generate the alert dialog.
                // IMPORTANT: you must pass in the *Activity* instance to
                // generateRateMyAppAlertDialog(Context, String, String). If you
                // attempt to pass in getApplicationContext(), the AlertDialog
                // instance will not be created properly and the method will return
                // null.
                ((AlertDialogHandler)myHandler).setAlertDialog(
                    Crittercism.generateRateMyAppAlertDialog(MyActivity.this,
                    title, message));
                myHandler.dispatchMessage(Message.obtain(myHandler,
                AlertDialogHandler.ALERT_DIALOG_WHAT));

                Looper.loop();
                Looper.myLooper().quit();
            }
        }
    };

    // Instantiate data request object, and specify that it should include
    // information for Rate My App.
    CritterUserDataRequest request = new CritterUserDataRequest(cb)
                                         .requestRateMyAppInfo();

    // Fire off the request.
    request.makeRequest();
}

Note

重要:この方法では、次のような場合に null が返ります。

  • デバイスが API レベル 5 以上で動作していない。
  • null メッセージまたは長さゼロのメッセージが入った。
  • 呼び出しスレッドがルーパーとして初期化されていない (Looper.prepare() を呼び出していない)。
  • activityContext に有効なアクティビティ インスタンスが提供されていない。
  • ユーザーが Crittercism からオプトアウトしている。
  • アプリケーション パッケージに対する有効な課金の文字列 ("com.amazon.venezia" など) がなく、かつ``CrittercismConfig.getRateMyAppTestTarget()`` が null である。
  • これらの条件いずれかが検出されると、ライブラリはログに適切な警告を出力します。AlertDialog を表示する前に、必ず null でないことを確認してください!!!

コールバックとユーザー データ レポート

ユーザーのオプトアウト ステータス、ユーザー UUID、また最後のアプリのロード時にアプリがクラッシュしたかどうかに関する情報や、非同期ディスク読み出しまたはネットワーク IO を必要とする可能性のあるその他のデータを取得する場合は、ライブラリが CritterCallback と呼ばれるコールバック インターフェースを提供します。 開発者は CritterUserDataRequest オブジェクトを CritterCallback インスタンスで作成し、 その後返される CritterUserData レポートに含むデータのタイプを指定します。

import com.crittercism.app.Crittercism;
import com.crittercism.app.CritterCallback;
import com.crittercism.app.CritterUserData;
import com.crittercism.app.CritterUserDataRequest;

import android.os.Bundle;

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Crittercism.initialize(getApplicationContext(),
        "<CRITTERCISM_APP_ID>", crittercismConfig);
    someMethodInMyCode();
}

public void someMethodInMyCode() {
    /* EXAMPLE 1 */
    // Instantiate a CritterCallback object.
    CritterCallback cb1 = new CritterCallback() {
        // CritterCallback is an interface that requires you to implement
        // onCritterDataReceived(CritterUserData).
        @Override public void onCritterDataReceived(CritterUserData userData) {
            // ...do something with userData
        }
    };

    // Instantiate a CritterUserDataRequest object.
    CritterUserDataRequest req1 = new CritterUserDataRequest(cb1);

    // Request information on whether previous session crashed.
    req1.requestDidCrashOnLastLoad();

    // Fire off request.
    req1.makeRequest();


    /* EXAMPLE 2 */
    // Instantiate a CritterCallback object.
    CritterCallback cb2 = new CritterCallback() {
        // CritterCallback is an interface that requires you to implement
        // onCritterDataReceived(CritterUserData).
        @Override public void onCritterDataReceived(CritterUserData userData) {
            // ...do something with userData
        }
    };

    // The various request* methods return the CritterUserDataRequest instance,
    // so you can chain their calls.  For example, the following request will
    // include information on user UUID, Rate My App settings, and last session
    // crashing.
    CritterUserDataRequest req2 = new CritterUserDataRequest(cb2)
                                        .requestDidCrashOnLastLoad()
                                        .requestUserUUID()
                                        .requestRateMyAppInfo();

    // Fire off request.
    req2.makeRequest();
}

CrittercismUserData オブジェクトは、次の API 呼び出しをサポートしています。

API 呼び出し 説明
crashedOnLastLoad() 前のセッションでアプリがクラッシュしていれば true を返します。正しく機能するようにするには、ユーザーがオプトアウトされていないこと、また開発者が requestDidCrashOnLastLoad() を適切な CritterUserDataRequestObject に対して呼び出すことが必要です。それ以外の場合には、false を返します。
isOptedOut() ユーザーが Crittercism からオプトアウトしている場合に true を返します。それ以外の場合には、false を返します。
getUserUUID() Crittercism ライブラリが生成した一意のユーザー UUID を返します。正しく機能するようにするには、ユーザーがオプトアウトされていないこと、また開発者が requestUserUUID() を適切な CritterUserDataRequestObject に対して呼び出すことが必要です。それ以外の場合には、null を返します。
getRateMyAppMessage() ダイアログが表示されるべき場合には、サーバー指定の Rate My App メッセージを返します。正しく機能するようにするには、ユーザーがオプトアウトされていないこと、また開発者が requestRateMyAppInfo () を適切な CritterUserDataRequestObject に対して呼び出すことが必要です。それ以外の場合には、null を返します。
getRateMyAppTitle() ダイアログが表示されるべき場合には、サーバー指定の My App タイトルを返します。正しく機能するようにするには、ユーザーがオプトアウトされていないこと、また開発者が requestRateMyAppInfo () を適切な CritterUserDataRequestObject に対して呼び出すことが必要です。それ以外の場合には、null を返します。
shouldShowRateMyAppAlert() [Rate My App (アプリ評価)] アラート ダイアログが表示されるべき場合には true を返します。正しく機能するようにするには、ユーザーがオプトアウトされていないこと、また開発者が requestRateMyAppInfo () を適切な CritterUserDataRequestObject に対して呼び出すことが必要です。それ以外の場合には、false を返します。

Crittercism 詳細オプションの設定

バージョン名のカスタマイズ (オプション)

Note

ライブラリ バージョン 3.0.3 以降でサポートされています。

この設定オプションでは、Crittercism にレポートされるアプリのバージョン診断をカスタマイズできます。クラッシュ、処理される例外、アプリのロード、サービス モニタリング データをカスタム アプリ バージョンでフィルタすることができ、ウェブサイトの Proguard マッピングのアップロード ページでこのバージョンが表示されるようになります。

ライブラリ バージョン 3.1.4 以降では、次のコード例で示すように CrittercismConfig のインスタンスを使用します。

import com.crittercism.app.Crittercism;
import com.crittercism.app.CrittercismConfig;

import android.os.Bundle;

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // create the CrittercismConfig instance.
    CrittercismConfig config = new CrittercismConfig();
    String myCustomVersionName = "My Custom Version Name";
    // set the custom version name.
    config.setCustomVersionName(myCustomVersionName);
    // initialize.
    Crittercism.initialize(getApplicationContext(),
        "<CRITTERCISM_APP_ID>", crittercismConfig);
}

バージョン コードを含める

Note

ライブラリ バージョン 3.0.11 以降でサポートされています。

この設定オプションでは、アプリ バージョン名にマニフェスト ファイルからのバージョン コードを含むことができます。ウェブサイトでは、バージョンのフォーマットが VERSIONNAME-VERSIONCODE のようになります。デフォルトでは、この設定は false になっています。

ライブラリ バージョン 3.1.4 以降では、次のコードで示すように CrittercismConfig のインスタンスを使用します。

import com.crittercism.app.Crittercism;
import com.crittercism.app.CrittercismConfig;

import android.os.Bundle;

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Create the CrittercismConfig instance.
    CrittercismConfig config = new CrittercismConfig();
    boolean shouldIncludeVersionCode = true;
    // Set the custom version name.
    config.setVersionCodeToBeIncludedInVersionString(shouldIncludeVersionCode);
    // Initialize.
    Crittercism.initialize(getApplicationContext(),
        "<CRITTERCISM_APP_ID>", crittercismConfig);
}

Logcat を含む

システム ログ データ (Logcat) を含んでおくと、クラッシュのデバッグに有用なことがあります。Crittercism では、logcat にアクセスしなくても作業ができます。ライブラリ バージョン 3.0 以降を使用している場合は、API レベル 16 以上 (Jelly Bean 以降) の logcat 情報を収集することができます。

ライブラリ バージョン 3.1.4 以降では、次のコードで示すように CrittercismConfig のインスタンスを使用します。

import com.crittercism.app.Crittercism;
import com.crittercism.app.CrittercismConfig;

import android.os.Bundle;

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Create the CrittercismConfig instance.
    CrittercismConfig config = new CrittercismConfig();
    boolean shouldCollectLogcat = true;
    // Enable logcat collection.
    config.setLogcatReportingEnabled(shouldCollectLogcat);
    // Initialize.
    Crittercism.initialize(getApplicationContext(),
        "<CRITTERCISM_APP_ID>", config);
}

アプリ ロード データの送信

Note

ライブラリ バージョン 3.0.0 以降でサポートされています。

Crittercism SDK では、Crittercism が初期化されるとアプリのロードをレポートします。アプリのロード データを後で送信するには、適切な設定オプションを true に設定する必要があります。アプリのロード データの送信を遅らせるパラメーターを設定したら、 Crittercism.sendAppLoadData() を呼び出せばいつでもアプリのロード情報を送信できます。

ライブラリ バージョン 3.1.4 以降では、次のコードで示すように CrittercismConfig のインスタンスを使用します。

import com.crittercism.app.Crittercism;
import com.crittercism.app.CrittercismConfig;

import android.os.Bundle;

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Create the CrittercismConfig instance.
    CrittercismConfig config = new CrittercismConfig();
    boolean delaySendingAppLoad = true;
    // Set the boolean in the config object.
    config.setDelaySendingAppLoad(delaySendingAppLoad);
    // Initialize.
    Crittercism.initialize(getApplicationContext(),
        "<CRITTERCISM_APP_ID>", crittercismConfig);
}

// At some later point...
public void sendLoadToCritterz() {
    Crittercism.sendAppLoadData();
}

オプションの設定パラメーター

Note

ライブラリ バージョン 3.0.0 以降でサポートされています。

ライブラリ バージョン 3.0.0 以降では、初期化呼び出しでオプションの設定オブジェクトを受信して logcat 収集、バージョン名、アプリのロード要求タイミングの設定をカスタマイズすることができます。

ライブラリ バージョン 3.1.4 以降では、以下のようにして設定することができます。

import com.crittercism.app.Crittercism;
import com.crittercism.app.CrittercismConfig;

import android.os.Bundle;

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    boolean delaySendingAppLoad = true;
    boolean shouldCollectLogcat = true;
    boolean shouldIncludeVersionCode = true;
    String myCustomVersionNmae = "someversion";
    String rateMyAppTestTarget = "http://some.test.target/";

    // Create the CrittercismConfig instance.
    CrittercismConfig config = new CrittercismConfig();
    // Enable the settings.
    config.setDelaySendingAppLoad(delaySendingAppLoad);
    config.setLogcatReportingEnabled(shouldCollectLogcat);
    config.setVersionCodeToBeIncludedInVersionString(shouldIncludeVersionCode);
    config.setCustomVersionName(myCustomVersionName);
    if (BuildConfig.DEBUG) {
        config.setRateMyAppTestTarget(rateMyAppTestTarget); // 3.2.0 and above!  FOR TESTING PURPOSES ONLY!!!!
    }

   // Initialize.
    Crittercism.initialize(getApplicationContext(),
        "<CRITTERCISM_APP_ID>", config);
}

CrittercismConfig オブジェクト には、次のような API 呼び出しがあります。

API 呼び出し 説明
setDelaySendingAppLoad(boolean) このパラメーターが true に設定されていると、Crittercism はアプリのロード時にすぐにアプリのロード データを送信しません。アプリのロード データは、後で Crittercism.sendAppLoadData() を使って送信できます。
setLogcatReportingEnabled(boolean) このパラメーターが true に設定されていると、Crittercism は Jelly Bean デバイス上のアプリケーションの logcat データを送信します。詳細については、「Logcat を含む」を参照してください。
setVersionCodeToBeIncludedInVersionString(String) このパラメーターが true に設定されていると、Crittercism はバージョン名にバージョン コードを含めます。詳細については、「バージョン コードを含める」を参照してください。
setCustomVersionName(String) この呼び出しでは、AndroidManifext.xml ファイルで指定されているバージョン名の代わりにカスタマイズしたバージョン名をサーバーに送信できます。
setRateMyAppTestTarget(String) 配布されていないバージョンのアプリで Rate My App 機能をテストする場合は、このメソッドに文字列を渡して (アプリ マーケットの代わりに) テスト URIを指定できます。詳細については、「Rate My App」を参照してください。注:本番ビルドではこれは使用しないでください!!