Java Android:下载完成后安装apk
我正在制作一个应用程序,其中一个功能是无需play store即可自我更新。我设法通过应用程序成功下载apk,但它不会自动安装。我已经有代码,将安装apk一旦下载完成。我是不是错过了什么?或者我使用的代码已经被弃用了Java Android:下载完成后安装apk,java,android,Java,Android,我正在制作一个应用程序,其中一个功能是无需play store即可自我更新。我设法通过应用程序成功下载apk,但它不会自动安装。我已经有代码,将安装apk一旦下载完成。我是不是错过了什么?或者我使用的代码已经被弃用了 public void sendNetworkUpdateAppRequest(String updateUrl) { try { PackageInfo pInfo = ctx.getPackageManager().getPackageI
public void sendNetworkUpdateAppRequest(String updateUrl) {
try {
PackageInfo pInfo = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(), 0);
currentVersion = pInfo.versionCode;
currentVersionName = pInfo.versionName;
new UpdateAppAsyncTask().execute(updateUrl);
} catch (Exception e) {
e.printStackTrace();
}
}
private void install(String apkFileName) {
try {
Intent intent;
File toInstall = new File(apkFileName);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Uri apkUri = FileProvider.getUriForFile(ctx, ctx.getPackageName() + ".provider", toInstall);
intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
intent.setData(apkUri);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
Uri apkUri = Uri.fromFile(toInstall);
intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
ctx.startActivity(intent);
} catch (Exception e) {
Toast.makeText(ctx, ctx.getString(R.string.update_error), Toast.LENGTH_LONG).show();
}
}
private static JSONObject getJson(String address) {
JSONObject jsonObject = null;
try {
URL url = new URL(address);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
InputStream in = new BufferedInputStream(conn.getInputStream());
String result = IOUtils.toString(in, "UTF-8");
in.close();
conn.disconnect();
jsonObject = new JSONObject(result);
} catch (Exception e) {
Log.d("InputStream", e.getLocalizedMessage());
}
return jsonObject;
}
private void UpdateApp(final String apkurl, final Integer newVersion) {
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
try {
String action = intent.getAction();
if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
Bundle extras = intent.getExtras();
DownloadManager.Query q = new DownloadManager.Query();
q.setFilterById(extras.getLong(DownloadManager.EXTRA_DOWNLOAD_ID));
Cursor c = dm.query(q);
if (c.moveToFirst()) {
int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
if (status == DownloadManager.STATUS_SUCCESSFUL) {
String apkLocation = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
String check = apkLocation = apkLocation.replace("file://", "");
install(apkLocation);
Toast.makeText(ctx, "Download Done", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(ctx, ctx.getString(R.string.update_error), Toast.LENGTH_LONG).show();
}
Log.i("handleData()", "Reason: " + c.getInt(c.getColumnIndex(DownloadManager.COLUMN_REASON)));
}
}
}catch (Exception e){
Toast.makeText(ctx, ctx.getString(R.string.update_error), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
};
ctx.registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
builder.setTitle(ctx.getString(R.string.update_available_title));
builder.setMessage(ctx.getString(R.string.update_available_msg))
.setCancelable(false)
.setPositiveButton(ctx.getString(R.string.ok), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
downloadedApkFileName = "ILYWIFEY" + "_" + String.valueOf(newVersion) + ".apk";
downloadedApkFileName = downloadedApkFileName.replace(" ", "_");
dialog.cancel();
dm = (DownloadManager) ctx.getSystemService(ctx.DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(apkurl));
request.setMimeType("application/vnd.android.package-archive");
request.setDescription(ctx.getString(R.string.update_provider_name));
request.setDestinationInExternalFilesDir(ctx, DIRECTORY_DOWNLOADS, downloadedApkFileName);
request.setTitle(downloadedApkFileName);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
dm.enqueue(request);
}
})
.setNegativeButton(ctx.getString(R.string.cancel), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
private class UpdateAppAsyncTask extends AsyncTask<String, Void, JSONObject> {
@Override
protected JSONObject doInBackground(String... urls) {
return getJson(urls[0]);
}
@Override
protected void onPostExecute(JSONObject jsonObject) {
try {
Integer newVersion = jsonObject.getInt("currentVersion");
if (currentVersion < newVersion) {
String newApkUrl = jsonObject.getString("apkUrl");
UpdateApp(newApkUrl, newVersion);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void sendnetworkupdateaprequest(字符串updateUrl){
试一试{
PackageInfo pInfo=ctx.getPackageManager().getPackageInfo(ctx.getPackageName(),0);
currentVersion=pInfo.versionCode;
currentVersionName=pInfo.versionName;
新的UpdateAppAsyncTask().execute(updateUrl);
}捕获(例外e){
e、 printStackTrace();
}
}
私有void安装(字符串apkFileName){
试一试{
意图;
File toInstall=新文件(apkFileName);
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.N){
Uri apkUri=FileProvider.getUriForFile(ctx,ctx.getPackageName()+“.provider”,toInstall);
intent=新intent(intent.ACTION\u INSTALL\u包);
setData(apkUri);
intent.setFlags(intent.FLAG\u GRANT\u READ\u URI\u PERMISSION);
}否则{
Uri apkUri=Uri.fromFile(toInstall);
意向=新意向(意向.行动\视图);
setDataAndType(apkUri,“application/vnd.android.package归档”);
intent.setFlags(intent.FLAG\u活动\u新任务);
}
星触觉(意图);
}捕获(例外e){
Toast.makeText(ctx,ctx.getString(R.string.update_error),Toast.LENGTH_LONG.show();
}
}
私有静态JSONObject getJson(字符串地址){
JSONObject JSONObject=null;
试一试{
URL=新的URL(地址);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod(“GET”);
InputStream in=新的BufferedInputStream(conn.getInputStream());
字符串结果=IOUtils.toString(在“UTF-8”中);
in.close();
连接断开();
jsonObject=新的jsonObject(结果);
}捕获(例外e){
d(“InputStream”,例如getLocalizedMessage());
}
返回jsonObject;
}
私有void UpdateApp(最终字符串apkurl,最终整数新版本){
BroadcastReceiver=新的BroadcastReceiver(){
@凌驾
公共void onReceive(上下文、意图){
试一试{
String action=intent.getAction();
if(DownloadManager.ACTION\u DOWNLOAD\u COMPLETE.equals(ACTION)){
Bundle extras=intent.getExtras();
DownloadManager.Query q=新的DownloadManager.Query();
q、 setFilterById(extras.getLong(DownloadManager.EXTRA_DOWNLOAD_ID));
游标c=dm.query(q);
if(c.moveToFirst()){
int status=c.getInt(c.getColumnIndex(DownloadManager.COLUMN_status));
if(status==DownloadManager.status\u SUCCESSFUL){
String apkLocation=c.getString(c.getColumnIndex(DownloadManager.COLUMN\u LOCAL\u URI));
字符串检查=apkLocation=apkLocation.replace(“文件:/”,“”);
安装(apkLocation);
Toast.makeText(ctx,“下载完成”,Toast.LENGTH_LONG.show();
}否则{
Toast.makeText(ctx,ctx.getString(R.string.update_error),Toast.LENGTH_LONG.show();
}
Log.i(“handleData()”,“Reason:+c.getInt(c.getColumnIndex(DownloadManager.COLUMN_Reason)));
}
}
}捕获(例外e){
Toast.makeText(ctx,ctx.getString(R.string.update_error),Toast.LENGTH_LONG.show();
e、 printStackTrace();
}
}
};
ctx.registerReceiver(接收器,新的意向过滤器(DownloadManager.ACTION\u DOWNLOAD\u COMPLETE));
AlertDialog.Builder=新建AlertDialog.Builder(ctx);
builder.setTitle(ctx.getString(R.string.update_available_title));
builder.setMessage(ctx.getString(R.string.update\u available\u msg))
.setCancelable(错误)
.setPositiveButton(ctx.getString(R.string.ok),新的DialogInterface.OnClickListener(){
public void onClick(DialogInterface对话框,int-id){
DownloadedAppFileName=“ILYWIFEY”+“”+String.valueOf(新版本)+“.apk”;
downloadedApkFileName=downloadedApkFileName.replace(“,”);
dialog.cancel();
dm=(DownloadManager)ctx.getSystemService(ctx.DOWNLOAD\u服务);
DownloadManager.Request=newdownloadmanager.Request(Uri.parse(apkurl));
setMimeType(“application/vnd.android.package归档”);
request.setDescription(ctx.getString(R.string.update_provider_name));
setDestinationNexternalFilesDir(ctx,目录下载,下载文件名);
request.setTitle(下载的文件名);
request.setNotificationVisibility(DownloadManager.request.VISIBILITY\u VISIBLE\u NOTIFY\u完成);
dm.enqueue(请求);
}
})
.setNegativeButton(ctx.getString(R.string.cancel),新的DialogInterface.OnClickListener(){
public void onClick(DialogInterface对话框,int-id){