Android:如何从webserver上托管的apk更新我的应用程序?

时间:2016-08-25 21:35:56

标签: android

我有一个私有的Android应用,而不是谷歌市场或谷歌播放。 apk文件托管在私人Web服务器上,并且还有一个URL,移动设备可以执行POST请求,以便检查是否有更新的版本。

现在,如果有更新的版本,我只会向用户显示一个“升级”按钮。 onclick监听器执行此操作:

final View.OnClickListener upgradeButton_OnClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String url = "https://example.com/android-app/app-release.apk";
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(intent);
    }
};

......但这并不理想。如果当我点击下载apk文件的按钮并且我被带到应用程序安装程序屏幕,其中显示“安装是/否”,那将是很好的。我只是不知道该怎么做。

我一直在互联网上寻找一种方法来做到这一点,我没有看到一个确凿的答案。有人可以指点我一个包含所有步骤的教程吗?我知道大多数人可能会使用谷歌市场或谷歌播放,但我不这样做,而且很难搞清楚这一点。

编辑1 -----------------------------------------

现在我在onclick监听器中有这个:

final View.OnClickListener upgradeButton_OnClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if(permissionCheck == PackageManager.PERMISSION_GRANTED){
            DownloadManager.Request request = new DownloadManager.Request(Uri.parse("https://example.com/android-app/app-release.apk"));
            request.setTitle("This App Upgrade.");
            request.setDescription("File is being downloaded ...");
            request.allowScanningByMediaScanner();
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "app-release.apk" );
            DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
            registerReceiver(onDownloadComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
            manager.enqueue(request);
        }
    }
};

而且:

BroadcastReceiver onDownloadComplete = new BroadcastReceiver(){
    @Override
    public void onReceive(Context context, Intent intent) {
        intent.setDataAndType(Uri.parse(Environment.DIRECTORY_DOWNLOADS + "app-release.apk"),
                "application/vnd.android.package-archive");
        startActivity(intent);
    }
};

我在尝试下载时遇到错误:

java.lang.SecurityException: No permission to write to /storage/emulated/0/Download/app-release.apk: Neither user 10062 nor current process has android.permission.WRITE_EXTERNAL_STORAGE.

这就是我尝试实现permissionCheck的原因,但现在当我点击按钮时根本没有任何事情发生。

1 个答案:

答案 0 :(得分:0)

是的,这是可能的。对于某些“IF”:电话必须已植根并启用第三方源安装。

基本上,您必须在下载文件后调用pm install Android的命令。

这是你可以下载文件的方法: Download a file with Android, and showing the progress in a ProgressDialog

这篇文章只是pm安装的一个例子

Process process = null;
try
{
    process  = Runtime.getRuntime().exec("su");
    DataOutputStream dataOutputStream=new DataOutputStream(process.getOutputStream());

    String cmd="pm install /sdcard/LatestUpdate.apk";
    dataOutputStream.writeBytes(cmd+"\n");
}
catch (IOException e)
{
    e.printStackTrace();
}

如果没有root,您可以尝试调用新的Intent as

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(filePath)),"application/vnd.android.package-archive");
startActivity(intent);

它将显示应用程序安装对话框。但仍然必须从未知来源安装