2

広告付きの無料版と広告なしの有料版の 2 つのバージョンで配布されるアプリを開発しています。広告の存在を除いて、アプリは完全に同一です。

通常、ユーザーは無料版を入手してから、必要に応じて商用版にアップグレードすると考えられています。

アプリを Google Play にアップロードするときは、新しい一意の ID を持つ完全に新しいアプリを作成する必要があります。つまり、同じアプリのこれら 2 つのバージョンは、実際には 2 つの完全に異なるプロジェクトであり、これを回避する方法はありません。

どのアプリがどの収入をもたらすかを監視しなければならないので、これは理にかなっています。

しかし、ここで問題が発生します。ユーザーが無料版から商用版にアップグレードすることを決定した場合、私は彼にすべてのローカル データを保持してもらいたいと考えています。明らかに、2 つのアプリケーションの名前が異なるとすぐに、これは起こりません。

この問題の簡単な解決策はありますか?

ありがとうございました。

4

1 に答える 1

3

ユーザーが無料版から有料版にアップグレードするときに、無料アプリと有料アプリの間でデータを共有する方法

これは、次のようなあらゆる種類の問題を伴う非常に一般的な問題です。

  • ユーザーが有料アプリをインストールして実行する、すべてのユーザー データが無料アプリからコピーされます。
  • ユーザーが有料アプリへのアップグレードを完了した後に無料アプリを使用しようとすると、自動的に有料アプリにリダイレクトされます。
  • ユーザーが有料アプリを削除した場合、無料アプリは以前と同様に引き続き機能することを許可する必要があります。

最も簡単な解決策は、ユーザー設定ではなく、データベースで共有する必要があるすべてのデータを維持することです。その後、有料アプリを初めて実行するときに、データベース ファイルを文字通り無料アプリから有料アプリにコピーできます。

いずれかのアプリのみ、または両方のアプリが同時にインストールされるという特別なユース ケース条件があるため、これはコンテンツ プロバイダーよりもうまく機能することがわかりました。

このシステムが機能するためには、いくつかの主要なツールを用意する必要があります。

  • アプリは、実行時に相互にインストールされているかどうかを検出できる必要があります。
  • アプリは、対応するアプリがデータベース ファイルを保存する場所を認識している必要があります。
  • 何が起こったかを示すために、いくつかのフラグをデータベース ファイルに保存する必要があります。

他のアプリがインストールされているかどうかを確認する方法:

final String packageName = "com.company.other-app-name";
android.content.pm.PackageManager pm = getPackageManager();
PackageInfo info = pm.getPackageInfo(packageName, 0);

info==nullまたは aNameNotFoundExceptionがスローされた場合、アプリはインストールされていません。

データベースファイルをコピーする方法:

データベース ファイルは次のように保存されます。

paidDb = "/data/data/<paid-app-package-name>/databases/<db-name>.db"
freeDb = "/data/data/<free-app-package-name>/databases/<db-name>.db"

コピー関数は、これらのファイルのオブジェクトを開いFileInputStreamて、次のような標準的な方法でコピーする必要があります。FileOutputStream

while ((length = fis.read(buffer))>0) {
    fos.write(buffer, 0, length);
}

これにより、有料アプリが無料アプリがインストールされているかどうかを判断できるようにするために必要なすべてのツールが提供され、インストールされている場合はデータベースをコピーしてそこから続行できます。無料アプリは、有料アプリがインストールされているかどうかを確認する必要があります。その場合は、わかりやすい警告で終了するか、次のように有料アプリにリダイレクトします。

android.content.pm.PackageManager pm = getPackageManager();
final Intent intent = pm.getLaunchIntentForPackage(packageName);
startActivity( intent );
finish();

オプションの無料アプリの削除:

有料アプリが無料アプリを検出してデータベースをコピーしたら、オプションで、次のようにユーザーに無料アプリを削除するように依頼できます。

Uri uri = Uri.parse("package:<free-app-package-name>");
Intent intent = new Intent(Intent.ACTION_DELETE, uri);
startActivityForResult(intent, REQUEST_CODE_UNINSTALL_FREE_APP);

注: ユーザーが要求どおりに無料アプリを実際にアンインストールすることを保証することはできません。この値REQUEST_CODE_UNINSTALL_FREE_APPは、有料アプリのアンインストーラーから戻ったときにonActivityResult()、ユーザーが削除を完了したかどうかを確認できるようにするために使用されます。次に、アンインストールが行われなかった場合は、通常の「よろしいですか?」と尋ねます。または「再試行しますか?」ダイアログを表示するか、彼にすべての厳格さを取得し(推奨されません)、新しい有料アプリの使用を継続できるようにする前に、アンインストールを強制的に終了させます.

さらなる考慮事項

  • 共有コードはすべてAndroid LIBrary プロジェクト内にある必要があり、各アプリは共有ライブラリを使用する軽量のラッパー プロジェクトである必要があります。3 つのプロジェクトはすべて、1 つの Eclipse ワークスペースにあります。
  • 有料アプリ プロジェクトにはAndroid License Verification Library (LVL)の使用を検討してください(ライブラリ プロジェクトや無料アプリには LVL は必要ありません)。
  • また、これらのアイデアをすべて破棄して、アプリケーションを 1 つだけ作成し、アプリ内課金を使用して無料から有料にアップグレードすることも検討してください。これは、この質問の範囲をはるかに超えています。
于 2013-03-20T18:18:51.293 に答える