Java Android:下载完成后安装apk

Java Android:下载完成后安装apk,java,android,Java,Android,我正在制作一个应用程序,其中一个功能是无需play store即可自我更新。我设法通过应用程序成功下载apk,但它不会自动安装。我已经有代码,将安装apk一旦下载完成。我是不是错过了什么?或者我使用的代码已经被弃用了 public void sendNetworkUpdateAppRequest(String updateUrl) { try { PackageInfo pInfo = ctx.getPackageManager().getPackageI

我正在制作一个应用程序,其中一个功能是无需play store即可自我更新。我设法通过应用程序成功下载apk,但它不会自动安装。我已经有代码,将安装apk一旦下载完成。我是不是错过了什么?或者我使用的代码已经被弃用了

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){