PrivacyControl
PrivacyControl を利用すると、アプリ実行中にエンドユーザの操作によって、FANSHIP サーバへのデータ送信と、FANSHIP SDK の主要機能を停止することができます。
PrivacyControl は、大きく下記の2機能で構成されています
- カスタマイズを前提とした利用許諾画面
- データ送信と主要機能を停止・再開する機能
PrivacyControl を利用するためには、アプリの AndroidManifest.xml へフラグを追加します。
<meta-data
android:name="POPINFO_USES_PRIVACY_CONTROL"
android:value="true" />
許諾状態は PopinfoPrivacyControlStatus で定義されています。
public enum PopinfoPrivacyControlStatus {
NotDetermined(0), // 未選択
Accepted(1), // 同意
Denied(2); // 同意しない
}
PrivacyControl を導入後 PopinfoPrivacyControlStatus は以下の仕様に従って初期化されます。
| PopinfoID | PopinfoPrivacyControlStatus |
|---|---|
| アクティベート前 | NotDetermined |
| アクティベート後 | Accepted |
Info
ユーザー初回起動の時点で既にPrivacyControlが導入されている場合、
PopinfoID は未だアクティベートされていないため NotDetermined で初期化されます。
アプリのアップデートによって初めてPrivacyControlが導入された場合、
PopinfoID は既にアクティベート済みとなるため Accepted で初期化されます。
Warning
PrivacyControl導入後は、許諾状態が PopinfoPrivacyControlStatusAccepted の場合のみ、
FANSHIP サーバへのデータ送信、およびFANSHIP SDK の主要機能が有効となります。
また、自動的にオプトインダイアログ機能が有効となり、
初回起動時のプッシュ通知、位置情報取得に関する許諾処理が実施されなくなります。
利用許諾画面の表示
利用許諾画面用のクラスとして PopinfoPrivacyControlActivity が用意されています。
実装例は以下の通りです。
表示方法
ActivityResultLauncher方式
Info
許諾画面の呼び出し元が AppCompatActivity と FragmentActivity の場合、こちらをご使用ください。
public class MainActivity extends AppCompatActivity {
private final String KEY_SHOWED_PRIVACY_CONTROL = "POPINFO_SHOWED_PRIVACY_CONTROL";
private final ActivityResultLauncher<Intent> privacyControlLauncher
= registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == RESULT_OK) {
// ユーザーが「同意する」を選択
if (Popinfo.getPrivacyControlStatus(MainActivity.this) == PopinfoPrivacyControlStatus.Accepted) {
// 「同意する」選択後にPush許諾確認ダイアログなどを任意で呼び出し
//Popinfo.startPushOptin(MainActivity.this);
} else if (Popinfo.getPrivacyControlStatus(MainActivity.this) == PopinfoPrivacyControlStatus.Denied) {
// ユーザーが「同意しない」を選択
}
} else {
// ユーザーがバックキーを押した or サーバー通信で更新に失敗した
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 起動時にPrivacyControlが「未選択」の場合
if (Popinfo.getPrivacyControlStatus(MainActivity.this) == PopinfoPrivacyControlStatus.NotDetermined) {
// 許諾画面を表示
showPrivateControl();
}
// 起動時にPrivacyControlが「同意済み」の場合
if (Popinfo.getPrivacyControlStatus(MainActivity.this) == PopinfoPrivacyControlStatus.Accepted) {
// 過去に許諾画面を表示したことがある場合
if (isShowedPrivacyControl()) {
// FANSHIPのサービスを起動
Popinfo.start(MainActivity.this, true);
} else {
// 9.0.0以前のSDKからのアップデート時
// 許諾画面を表示
showPrivateControl();
}
}
}
// PrivacyControl許諾画面を表示
private void showPrivateControl() {
// 一度ステータスを「未選択」にする
Popinfo.setPrivacyControlStatus(MainActivity.this,
PopinfoPrivacyControlStatus.NotDetermined,
new PopinfoAsyncCallback<Boolean>() {
// 変更成否のレスポンス
@Override
public void onResponse(Boolean result) {
// 更新成功
if (result) {
// 許諾画面を表示
privacyControlLauncher.launch(new Intent(getApplicationContext(),
PopinfoPrivacyControlActivity.class));
// 表示済みフラグをセット
setShowedPrivacyControl(true);
}
}
});
}
// PrivacyControl許諾画面を表示したことがあるか判定
private boolean isShowedPrivacyControl() {
SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
return sPrefs.getBoolean(KEY_SHOWED_PRIVACY_CONTROL,false);
}
// PrivacyControl許諾画面を表示したフラグをセット
private void setShowedPrivacyControl(boolean value) {
SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
SharedPreferences.Editor editor = sPrefs.edit();
editor.putBoolean(KEY_SHOWED_PRIVACY_CONTROL, value);
editor.commit();
}
class MainActivity : AppCompatActivity() {
private val KEY_SHOWED_PRIVACY_CONTROL = "POPINFO_SHOWED_PRIVACY_CONTROL"
private val privacyControlLauncher = registerForActivityResult<Intent, ActivityResult>(
ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
if (result.resultCode == RESULT_OK) {
// ユーザーが「同意する」を選択
if (Popinfo.getPrivacyControlStatus(this@MainActivity) == PopinfoPrivacyControlStatus.Accepted) {
// Push許諾確認ダイアログなどを任意で呼び出し
// Popinfo.startPushOptin(this@MainActivity);
} else if (Popinfo.getPrivacyControlStatus(this@MainActivity) == PopinfoPrivacyControlStatus.Denied) {
// ユーザーが「同意しない」を選択
}
} else {
// ユーザーがバックキーを押した or サーバー通信で更新に失敗した
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 起動時にPrivacyControlが「未選択」の場合
if (Popinfo.getPrivacyControlStatus(this@MainActivity) == PopinfoPrivacyControlStatus.NotDetermined) {
// 許諾画面を表示
showPrivateControl()
}
// 起動時にPrivacyControlが「同意済み」の場合
if (Popinfo.getPrivacyControlStatus(this@MainActivity) == PopinfoPrivacyControlStatus.Accepted) {
// 過去に許諾画面を表示したことがある場合
if (isShowedPrivacyControl()) {
// FANSHIPのサービスを起動
Popinfo.start(this@MainActivity, true)
} else {
// 9.0.0以前のSDKからのアップデート時
// 許諾画面を表示
showPrivateControl()
}
}
}
// PrivacyControl許諾画面を表示
private fun showPrivateControl() {
// 一度ステータスを「未選択」にする
Popinfo.setPrivacyControlStatus(this@MainActivity,
PopinfoPrivacyControlStatus.NotDetermined,
object : PopinfoAsyncCallback<Boolean>() {
// 変更成否のレスポンス
override fun onResponse(result: Boolean) {
// 更新成功
if (result) {
// 許諾画面を表示
privacyControlLauncher.launch(
Intent(
applicationContext,
PopinfoPrivacyControlActivity::class.java
)
)
// 表示済みフラグをセット
setShowedPrivacyControl(true)
}
}
})
}
// PrivacyControl許諾画面を表示したことがあるか判定
private fun isShowedPrivacyControl(): Boolean {
val sPrefs = PreferenceManager.getDefaultSharedPreferences(this@MainActivity)
return sPrefs.getBoolean(KEY_SHOWED_PRIVACY_CONTROL, false)
}
// PrivacyControl許諾画面を表示したフラグをセット
private fun setShowedPrivacyControl(value: Boolean) {
val sPrefs = PreferenceManager.getDefaultSharedPreferences(this@MainActivity)
val editor = sPrefs.edit()
editor.putBoolean(KEY_SHOWED_PRIVACY_CONTROL, value)
editor.commit()
}
Warning
ActivityResultLauncher を使う場合は build.gradle に
implementation 'androidx.appcompat:appcompat:1.3.0-alpha02' 以降のバージョンの記載が必要です。
startActivityForResult方式
Info
許諾画面の呼び出し元が Activity の場合、こちらをご使用ください。
public class MainActivity extends Activity {
private static final int PRIVACY_CONTROL_REQUEST_CODE = 123;
private final String KEY_SHOWED_PRIVACY_CONTROL = "POPINFO_SHOWED_PRIVACY_CONTROL";
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case (PRIVACY_CONTROL_REQUEST_CODE):
if (resultCode == RESULT_OK) {
// ユーザーが「同意する」を選択
if (Popinfo.getPrivacyControlStatus(MainActivity.this) == PopinfoPrivacyControlStatus.Accepted) {
// 「同意する」選択後にPush許諾確認ダイアログなどを任意で呼び出し
// Popinfo.startPushOptin(MainActivity.this);
} else if (Popinfo.getPrivacyControlStatus(MainActivity.this) == PopinfoPrivacyControlStatus.Denied) {
// ユーザーが「同意しない」を選択
}
} else {
// ユーザーがバックキーを押した or サーバー通信で更新に失敗した
}
break;
default:
break;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 起動時にPrivacyControlが「未選択」の場合
if (Popinfo.getPrivacyControlStatus(MainActivity.this) == PopinfoPrivacyControlStatus.NotDetermined) {
// 許諾画面を表示
showPrivateControl();
}
// 起動時にPrivacyControlが「同意済み」の場合
if (Popinfo.getPrivacyControlStatus(MainActivity.this) == PopinfoPrivacyControlStatus.Accepted) {
// 過去に許諾画面を表示したことがある場合
if (isShowedPrivacyControl()) {
// FANSHIPのサービスを起動
Popinfo.start(MainActivity.this, true);
} else {
// 9.0.0以前のSDKからのアップデート時
// 許諾画面を表示
showPrivateControl();
}
}
}
// PrivacyControl許諾画面を表示
private void showPrivateControl() {
// 一度ステータスを「未選択」にする
Popinfo.setPrivacyControlStatus(MainActivity.this,
PopinfoPrivacyControlStatus.NotDetermined,
new PopinfoAsyncCallback<Boolean>() {
// 変更成否のレスポンス
@Override
public void onResponse(Boolean result) {
// 更新成功
if (result) {
// 許諾画面を表示
startActivityForResult(new Intent(MainActivity.this, PopinfoPrivacyControlActivity.class),
PRIVACY_CONTROL_REQUEST_CODE);
// 表示済みフラグをセット
setShowedPrivacyControl(true);
}
}
});
}
// PrivacyControl許諾画面を表示したことがあるか判定
private boolean isShowedPrivacyControl() {
SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
return sPrefs.getBoolean(KEY_SHOWED_PRIVACY_CONTROL,false);
}
// PrivacyControl許諾画面を表示したフラグをセット
private void setShowedPrivacyControl(boolean value) {
SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
SharedPreferences.Editor editor = sPrefs.edit();
editor.putBoolean(KEY_SHOWED_PRIVACY_CONTROL, value);
editor.commit();
}
class MainActivity : Activity() {
private val PRIVACY_CONTROL_REQUEST_CODE = 123
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
PRIVACY_CONTROL_REQUEST_CODE -> if (resultCode == RESULT_OK) {
// ユーザーが「同意する」を選択
if (Popinfo.getPrivacyControlStatus(this@MainActivity) == PopinfoPrivacyControlStatus.Accepted) {
// 「同意する」選択後にPush許諾確認ダイアログなどを任意で呼び出し
// Popinfo.startPushOptin(MainActivity.this);
} else if (Popinfo.getPrivacyControlStatus(this@MainActivity) == PopinfoPrivacyControlStatus.Denied) {
// ユーザーが「同意しない」を選択
}
} else {
// ユーザーがバックキーを押した or サーバー通信で更新に失敗した
}
else -> {}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 起動時にPrivacyControlが「未選択」の場合
if (Popinfo.getPrivacyControlStatus(this@MainActivity) == PopinfoPrivacyControlStatus.NotDetermined) {
// 許諾画面を表示
showPrivateControl()
}
// 起動時にPrivacyControlが「同意済み」の場合
if (Popinfo.getPrivacyControlStatus(this@MainActivity) == PopinfoPrivacyControlStatus.Accepted) {
// 過去に許諾画面を表示したことがある場合
if (isShowedPrivacyControl()) {
// FANSHIPのサービスを起動
Popinfo.start(this@MainActivity, true)
} else {
// 9.0.0以前のSDKからのアップデート時
// 許諾画面を表示
showPrivateControl()
}
}
}
// PrivacyControl画面を表示
private fun showPrivateControl() {
// 一度ステータスを「未選択」にする
Popinfo.setPrivacyControlStatus(this@MainActivity,
PopinfoPrivacyControlStatus.NotDetermined,
object : PopinfoAsyncCallback<Boolean>() {
// 変更成否のレスポンス
override fun onResponse(result: Boolean) {
// 更新成功
if (result) {
// 許諾画面を表示
startActivityForResult(
Intent(this@MainActivity, PopinfoPrivacyControlActivity::class.java),
PRIVACY_CONTROL_REQUEST_CODE
)
// 表示済みフラグをセット
setShowedPrivacyControl(true)
}
}
})
}
// PrivacyControl画面を表示したことがあるか判定
private fun isShowedPrivacyControl(): Boolean {
val sPrefs = PreferenceManager.getDefaultSharedPreferences(this@MainActivity)
return sPrefs.getBoolean(KEY_SHOWED_PRIVACY_CONTROL, false)
}
// PrivacyControl画面を表示したフラグをセット
private fun setShowedPrivacyControl(value: Boolean) {
val sPrefs = PreferenceManager.getDefaultSharedPreferences(this@MainActivity)
val editor = sPrefs.edit()
editor.putBoolean(KEY_SHOWED_PRIVACY_CONTROL, value)
editor.commit()
}
カスタマイズ例
- 各画面のカスタマイズ を参考に、画面のカスタマイズを行なってください。
popinfo_values.xmlの指定は不要です。 - 許諾画面クラス内で、表示させたい許諾画面のURL、またはHTMLファイルのパスを
String urlで指定します。 - サンプルHTMLを表示させたい場合はSDK同梱の
privacy_terms_sample.htmlをコピーし、アプリのsrc/main/assets内へコピーします。(assetsフォルダがない場合は作成してください) - 許諾画面の表示処理(
privacyControlLauncher.launchやstartActivityForResult)で指定されているクラス名を変更します。
多言語化(リンク)
こちら を参照ください。
データ送信と主要機能を停止・再開する機能
Popinfo.setPrivacyControlStatus を利用して、FANSHIP サーバへのデータ送信、およびFANSHIP SDK の主要機能を停止・再開することができます。
実装例は以下の通りです。
停止方法
Popinfo.setPrivacyControlStatus(MainActivity.this,
PopinfoPrivacyControlStatus.Denied,
new PopinfoAsyncCallback<Boolean>() {
@Override
public void onResponse(Boolean result) {
if (result) {
// 「同意しない」に更新成功
// サービス停止
} else {
// 「同意しない」に更新失敗
}
}
});
Popinfo.setPrivacyControlStatus(this@MainActivity,
PopinfoPrivacyControlStatus.Denied,
object : PopinfoAsyncCallback<Boolean>() {
override fun onResponse(result: Boolean) {
if (result) {
// 「同意しない」に更新成功
// サービス停止
} else {
// 「同意しない」に更新失敗
}
}
})
再開方法
Popinfo.setPrivacyControlStatus(MainActivity.this,
PopinfoPrivacyControlStatus.Accepted,
new PopinfoAsyncCallback<Boolean>() {
@Override
public void onResponse(Boolean result) {
if (result) {
// 「同意する」に更新成功
// サービス再開
} else {
// 「同意する」に更新失敗
}
}
});
Popinfo.setPrivacyControlStatus(this@MainActivity,
PopinfoPrivacyControlStatus.Accepted,
object : PopinfoAsyncCallback<Boolean>() {
override fun onResponse(result: Boolean) {
if (result) {
// 「同意する」に更新成功
// サービス再開
} else {
// 「同意する」に更新失敗
}
}
})
未選択状態へ設定
Popinfo.setPrivacyControlStatus(MainActivity.this,
PopinfoPrivacyControlStatus.NotDetermined,
new PopinfoAsyncCallback<Boolean>() {
@Override
public void onResponse(Boolean result) {
if (result) {
// 「未選択」に更新成功
} else {
// 「未選択」に更新失敗
}
}
});
Popinfo.setPrivacyControlStatus(this@MainActivity,
PopinfoPrivacyControlStatus.NotDetermined,
object : PopinfoAsyncCallback<Boolean>() {
override fun onResponse(result: Boolean) {
if (result) {
// 「未選択」に更新成功
} else {
// 「未選択」に更新失敗
}
}
})
Info
規約の更新時など、再度許諾画面を表示したい場合は「未選択」をセットすることができます。
Warning
PopinfoIDのアクティベートが完了している場合、
PopinfoPrivacyControlStatusの変更にはFANSHIP サーバとの通信を必要とします。
通信に失敗すると、変更が行われません。
FANSHIP サーバとの通信が失敗するなど「PopinfoPrivacyControlStatusの変更が行われなかった場合」は result が false となります。
状態取得の方法
PopinfoPrivacyControlStatus status = Popinfo.getPrivacyControlStatus(MainActivity.this);
if (status == PopinfoPrivacyControlStatus.Accepted) {
// 同意済み
}
if (status == PopinfoPrivacyControlStatus.Denied) {
// 同意しない
}
if (status == PopinfoPrivacyControlStatus.NotDetermined) {
// 未選択
}
主要機能停止時の詳細動作
PrivacyControl導入後、許諾状態が PopinfoPrivacyControlStatusAccepted 以外となった場合、FANSHIP サーバへのデータ送信、およびFANSHIP SDK の主要機能が停止しますが詳細は以下の通りです。
| 停止する機能 | 備考 |
|---|---|
| プッシュ通知 | 配信対象から除外されます |
| コンテンツ配信(お知らせ) | 新規取得のみ停止します |
| アプリ内メッセージ | |
| イベントトラッキング | |
| ユーザ属性設定 | |
| プッシュ通知の許諾ダイアログ | |
| 位置情報取得の許諾ダイアログ | |
| インフォメーションダイアログ | |
| お知らせ設定画面 | ユーザーIDのみ表示されます |
| ユーザID(PopinfoID) | nullを返すようになります(お知らせ画面では停止前のIDが表示されます) |
| 位置情報更新 | |
| Wi-Fi検知 | |
| Beacon検知 |