Android アプリケーションを作成し、*.apk
. apk
インストールが成功したときにファイルを自動的に削除することは可能ですか?
4 に答える
アプリケーションを介してダウンロードする他のAPKをインストールしていて、インストールが成功した後に削除したい場合は、私に従ってください:-)
ステップ 1: 次の権限を宣言しますAndroidManifest.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_ADDED" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_CHANGED" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_INSTALL" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_REPLACED" />
ステップ 2: 受信者を登録する
<receiver
android:name="com.az.appstore.InstallReceiver"
android:enabled="true" >
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_CHANGED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<action android:name="android.intent.action.PACKAGE_INSTALL" />
<data android:scheme="package" />
</intent-filter>
</receiver>
ステップ 4:
インストーラー アクティビティで、このようなハッシュ マップを作成します。これは で作成しましApplicationMain
た。実装によって異なります。
public static final ConcurrentHashMap<String, File> INSTALL_APK_INFO = new ConcurrentHashMap<String, File>();
apk が配置されているパッケージ名とファイルを入力します。このメソッドを使用して、任意の apk からパッケージ名を取得できます
public static String getPackageNameForAPK(final String archiveFilePath, Context context) {
try {
PackageInfo info = context.getPackageManager().getPackageArchiveInfo(archiveFilePath, PackageManager.GET_META_DATA);
return info.packageName;
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
ステップ 5: インストールレシーバーでこれを行うだけです
if (action.equals(Intent.ACTION_PACKAGE_ADDED) || action.equals(Intent.ACTION_PACKAGE_CHANGED) || action.equals(Intent.ACTION_PACKAGE_INSTALL) || action.equals(Intent.ACTION_PACKAGE_REPLACED)) {
ApplicationInfo info = null;
try {
info = context.getPackageManager().getApplicationInfo(intent.getDataString().split(":")[1], PackageManager.GET_META_DATA);
} catch (Exception e) {
e.printStackTrace();
}
try {
if (info != null) {
File file = ApplicationMain.INSTALL_APK_INFO.get(info.packageName);
if (file != null) {
file.delete();
ApplicationMain.INSTALL_APK_INFO.remove(info.packageName);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
概要
1) ハッシュマップを作成し、APK パッケージ名とファイルを入力します。ファイルは、APK が存在する正確な場所です。
APKのインストールをリクエスト
public static void installUpdateAPK(Context context, String pathToAPK) {
pathToAPK = pathToAPK.replace("file:///", "");
final Intent intent = new Intent(Intent.ACTION_VIEW);
File file = new File(pathToAPK);
intent.setDataAndType(Uri.fromFile(file), APK_MIME_TYPE);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
String name = getPackageNameForAPK(pathToAPK, context);
if (name != null) {
ApplicationMain.INSTALL_APK_INFO.put(name, file);
}
}
2) パッケージの追加、変更、インストールの意図を登録する
3)レシーバーで、インストールされているパッケージ名を取得しますIntent
4)ハッシュマップからファイルオブジェクトを取得し、呼び出すだけですdelete()
インストールが完了した後、APK がデバイスの SD カードから削除されるかどうかは問題ではありません。そのような機能をアプリでプログラムできたとしても、ルート化されたデバイスを持つユーザーはいつでも/data/app/
システム パーティションから APK にアクセスできます。これにより、そもそも APK を削除しようとする努力が事実上無効になります。
そうは言っても、初回実行時に APK を削除する関数を追加できます。APK は SD カードのほぼどこにでも保存/保存できるため、これらの質問が役立つと思います。
ファイルを検索するには: SD カード全体で特定のファイルを検索します
見つかったファイルを削除するには: SD カードからファイルを削除するには?
apk がデバイスにダウンロードされた場所がわかっている場合は、アプリを最初に実行したときに、インストール後に削除できます。SD カード上にある場合は、書き込み権限が必要です。
ただし、保存場所がわからない場合は、せいぜいデバイスをスキャンして、指定した名前の apk ファイルを探して削除する必要があります。
さらに、インストールされると、apk は内部ストレージにコピーされます。ルート化されたデバイスを持つすべてのユーザーは、apk を回復できます。
ベータ テストは信頼の問題です。テストのために apk を渡す相手を信用できない場合は、渡さないでください。
アプリケーションの起動時に、sdcard/download フォルダー (または apk を保存する他の場所) を手動で確認できます。そこから削除します。
すべての実行で検索を避けるために、共有設定に first_run フィールドを保存できます。フィールドをデフォルトで true に設定し、最初の実行後に false に設定します。最初のラントを検出できるように