4

必要なすべての権限を持つシステム アプリケーションがあります。以前は、DownloadManager を使用して apk をダウンロードし、PackageManager の installPackage() を介してリフレクションを使用して、その apk をインストールしていました。

残念ながら、次の N の動作変更 http://developer.android.com/preview/behavior-changes.html :

DownloadManager は、プライベートに保存されたファイルをファイル名で共有できなくなりました。COLUMN_LOCAL_FILENAME にアクセスするときに、レガシー アプリケーションがアクセス不能なパスになる可能性があります。Android N 以降を対象とするアプリは、COLUMN_LOCAL_FILENAME にアクセスしようとすると SecurityException をトリガーします。setDestinationInExternalFilesDir(Context, String, String) または setDestinationInExternalPublicDir(String, String) を使用してダウンロード場所を公開場所に設定するレガシー アプリケーションは、引き続き COLUMN_LOCAL_FILENAME のパスにアクセスできますが、この方法はお勧めできません。DownloadManager によって公開されたファイルにアクセスするための推奨される方法は、openFileDescriptor(Uri, String) を使用することです。

古い方法で試してみると、許可が拒否されたというエラーが表示されます。

PM の installPackage() に渡すには Uri が必要なので、現在、PM が後でアクセスしてインストールできるように、(廃止された) WORLD_READABLE モードでアプリケーションのプライベート フォルダーにファイルをコピーするだけです。これは非常にハッキリしていて、誰かがより良い方法を知っているかどうか疑問に思っていました (androiddev によって提案された他のオプションは、ファイルをパブリック ディレクトリにダウンロードすることですが、これにはオプションではない WRITE_EXTERNAL_STORAGE 権限を追加する必要があります。)

4

0 に答える 0