Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在棉花糖上以编程方式安装APK_Android_Android Intent_Apk_Android 6.0 Marshmallow - Fatal编程技术网

Android 在棉花糖上以编程方式安装APK

Android 在棉花糖上以编程方式安装APK,android,android-intent,apk,android-6.0-marshmallow,Android,Android Intent,Apk,Android 6.0 Marshmallow,在我的一个用例中,开始的应用程序会联系服务器并下载同一应用程序的更新 对于下载,我使用的是Android的DownloadManager类。 然后使用下面的代码尝试在onReceive()中创建应用程序安装程序意图,即在APK成功下载后 @Override public void onReceive(Context context, Intent intent) { //check if the broadcast message is for our Enqueued downloa

在我的一个用例中,开始的应用程序会联系服务器并下载同一应用程序的更新

对于下载,我使用的是Android的DownloadManager类。 然后使用下面的代码尝试在
onReceive()
中创建应用程序安装程序意图,即在APK成功下载后

@Override
public void onReceive(Context context, Intent intent) {

    //check if the broadcast message is for our Enqueued download
    long referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
    if (downloadReference == referenceId) {
        try {
            Log.v("", "Downloading of the new app version complete");

            String filepath = Environment.getExternalStorageDirectory() + "/" +
                    Environment.DIRECTORY_DOWNLOADS + "/" + mLatestVersionFileName;

            //start the installation of the latest version
            Uri uri = downloadManager.getUriForDownloadedFile(downloadReference);

            //downloadManager.getUriForDownloadedFile(downloadReference)
            Uri fileLoc = Uri.fromFile(new File(filepath));

            Intent promptInstall = new Intent(Intent.ACTION_VIEW);
            promptInstall.setDataAndType(uri, "application/vnd.android.package-archive");
            promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(promptInstall);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
该代码适用于棉花糖生产前的设备,用户可以在屏幕上安装APK

这在棉花糖设备上不起作用

我在棉花糖上遇到以下例外情况:

android.content.ActivityNotFoundException:找不到可处理Intent的活动{act=android.Intent.action.VIEW dat=content://downloads/my_downloads/287 typ=application/vnd.android.package-archive flg=0x10000000}

我试过以下几件事:

  • 使用棉花糖的确切包装安装程序
    (com.google.android.PackageInstaller/com.android.PackageInstaller.PackageInstaller.packageinstallectivity)
    组件名称作为意图的一部分
  • 传递fileLoc而不是uri
  • 这将导致“分析错误”


    理想情况下,意图由Android操作系统解决。我想这不是什么大问题,我可能在创建意图时遗漏了一些东西。

    你能试试这个吗:

    @Override
    public void onReceive(Context context, Intent intent) {
    
    String action = intent.getAction();
    
            if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
    
                DownloadManager.Query query = new DownloadManager.Query();
                query.setFilterById(yourDownloadID);
          DownloadManager dm = (DownloadManager)getSystemService(DOWNLOAD_SERVICE);
                Cursor downloadResult = dm.query(query);
    
                if (downloadResult.moveToFirst()) {
                    int statusColumnIndex = downloadResult.getColumnIndex(DownloadManager.COLUMN_STATUS);
                    int status = downloadResult.getInt(statusColumnIndex);
    
                    if (status == DownloadManager.STATUS_SUCCESSFUL) {
                        //download completed successfully
                        int localFileNameId = downloadResult.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME);
    
                        String downloadPathFile = downloadResult.getString(localFileNameId);
    
           Intent intent = new Intent(Intent.ACTION_VIEW);
                        intent.setDataAndType(Uri.fromFile(new File(downloadPathFile)), "application/vnd.android.package-archive");
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent);
    }
    
    试试这个

     public void onReceive(Context context, Intent intent) {
                    String action = intent.getAction();
                    if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
                        long downloadId = intent.getLongExtra(
                                DownloadManager.EXTRA_DOWNLOAD_ID, 0);
                        Query query = new Query();
                        query.setFilterById(enqueue);
                        Cursor c = dm.query(query);
                        if (c.moveToFirst()) {
                            int columnIndex = c
                                    .getColumnIndex(DownloadManager.COLUMN_STATUS);
                            if (DownloadManager.STATUS_SUCCESSFUL == c
                                    .getInt(columnIndex)) {
    
                                ImageView view = (ImageView) findViewById(R.id.imageView1);
                                String uriString = c
                                        .getString(c
                                                .getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
    
                                 //start the installation of the latest version
                                Uri uri = Uri.parse(uriString); 
                                Intent promptInstall = new Intent(Intent.ACTION_VIEW);
                                promptInstall.setDataAndType(uri, "application/vnd.android.package-archive");
                                promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                mContext.startActivity(promptInstall);
                            }
                        }
                    }
                }
    
     public void onReceive(Context context, Intent intent) {
                    String action = intent.getAction();
                    if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
                        long downloadId = intent.getLongExtra(
                                DownloadManager.EXTRA_DOWNLOAD_ID, 0);
                        Query query = new Query();
                        query.setFilterById(enqueue);
                        Cursor c = dm.query(query);
                        if (c.moveToFirst()) {
                            int columnIndex = c
                                    .getColumnIndex(DownloadManager.COLUMN_STATUS);
                            if (DownloadManager.STATUS_SUCCESSFUL == c
                                    .getInt(columnIndex)) {
    
                                ImageView view = (ImageView) findViewById(R.id.imageView1);
                                String uriString = c
                                        .getString(c
                                                .getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
    
                                 //start the installation of the latest version
                                Uri uri = Uri.parse(uriString); 
                                Intent promptInstall = new Intent(Intent.ACTION_VIEW);
                                promptInstall.setDataAndType(uri, "application/vnd.android.package-archive");
                                promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                mContext.startActivity(promptInstall);
                            }
                        }
                    }
                }