繁体   English   中英

从本地文件安装apk

[英]install an apk from a local file

我制作了一个应用程序,可以从内部服务器下载APK,将其保存在本地,并希望提示用户安装它。 我的代码如下:

        Button bt_install = (Button) findViewById(R.id.install_bt);
        bt_install.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new DownloadNewVersion().execute();
            }
        });
    }
    class DownloadNewVersion extends AsyncTask<String,Integer,Boolean> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            bar = new ProgressDialog(MainActivity.this);
            bar.setCancelable(false);
            bar.setMessage("Downloading...");
            bar.setIndeterminate(true);
            bar.setCanceledOnTouchOutside(false);
            bar.show();
        }
        protected void onProgressUpdate(Integer... progress) {
            super.onProgressUpdate(progress);
            bar.setIndeterminate(false);
            bar.setMax(100);
            bar.setProgress(progress[0]);
            String msg = "";
            if(progress[0]>99){
                msg="Finishing... ";
            }else {
                msg="Downloading... "+progress[0]+"%";
            }
            bar.setMessage(msg);
        }
        @Override
        protected void onPostExecute(Boolean result) {
// TODO Auto-generated method stub
            super.onPostExecute(result);
            bar.dismiss();
            if(result){
                Toast.makeText(getApplicationContext(),"Update Done",
                        Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(getApplicationContext(),"Error: Try Again",
                        Toast.LENGTH_SHORT).show();
            }
        }
        @Override
        protected Boolean doInBackground(String... arg0) {
            Boolean flag = false;
            try {
                URL url = new URL("http://androidpala.com/tutorial/app-debug.apk");
                HttpURLConnection c = (HttpURLConnection) url.openConnection();
                c.setRequestMethod("GET");
                c.setDoOutput(true);
                c.connect();
                String PATH = Environment.getExternalStorageDirectory()+"/Download/";
                File file = new File(PATH);
                file.mkdirs();
                File outputFile = new File(file,"app-debug.apk");
                if(outputFile.exists()){
                    outputFile.delete();
                }
                FileOutputStream fos = new FileOutputStream(outputFile);
                InputStream is = c.getInputStream();
                int total_size = 1431692;//size of apk
                byte[] buffer = new byte[1024];
                int len1 = 0;
                int per = 0;
                int downloaded=0;
                while ((len1 = is.read(buffer)) != -1) {
                    fos.write(buffer, 0, len1);
                    downloaded +=len1;
                    per = (int) (downloaded * 100 / total_size);
                    publishProgress(per);
                }
                fos.close();
                is.close();
                OpenNewVersion(PATH);
                flag = true;
            } catch (Exception e) {
                Log.e(TAG, "Update Error: " + e.getMessage());
                flag = false;
            }
            return flag;
        }
    }
    void OpenNewVersion(String location) {
        String filepath = Environment.getExternalStorageDirectory().getPath() +"/Download/"+"app-debug.apk";
        Uri fileLoc = Uri.fromFile(new File(filepath));
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(fileLoc, "application/vnd.android.package-archive");
        startActivity(intent);
    }




}

该路径具有APK的文件,因此下载没有问题,但是在尝试启动活动时会遇到Update Error。

我在这里做错了什么?

Logcot

11-30 14:30:54.075 5380-5380/net.amjadroid.fonts E/Zygote: v2
11-30 14:30:54.075 5380-5380/net.droid5d.myapp I/libpersona: KNOX_SDCARD checking this for 10342
11-30 14:30:54.075 5380-5380/net.droid5d.myapp I/libpersona: KNOX_SDCARD not a persona
11-30 14:30:54.075 5380-5380/net.droid5d.myapp E/Zygote: accessInfo : 0
11-30 14:30:54.076 5380-5380/net.droid5d.myapp W/SELinux: SELinux selinux_android_compute_policy_index : Policy Index[2],  Con:u:r:zygote:s0 RAM:SEPF_SECMOBILE_7.1.1_0001, [-1 -1 -1 -1 0 1]
11-30 14:30:54.076 5380-5380/net.droid5d.myapp I/SELinux: SELinux: seapp_context_lookup: seinfo=untrusted, level=s0:c512,c768, pkgname=net.droid5d.myapp 
11-30 14:30:54.079 5380-5380/net.droid5d.myapp I/art: Late-enabling -Xcheck:jni
11-30 14:30:54.148 5380-5380/net.droid5d.myapp V/ActivityThread: performLaunchActivity: mActivityCurrentConfig={0 1.0 themeSeq = 0 showBtnBg = 0 422mcc2mnc [ar_AE,en_US] ldrtl sw411dp w411dp h773dp 560dpi nrml long port ?dc finger -keyb/v/h -nav/h mkbd/h desktop/d s.8}
11-30 14:30:54.153 5380-5380/net.droid5d.myapp W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
11-30 14:30:54.182 5380-5380/net.droid5d.myapp D/TextView: setTypeface with style : 0
11-30 14:30:54.183 5380-5380/net.droid5d.myapp D/TextView: setTypeface with style : 0
11-30 14:30:54.188 5380-5380/net.droid5d.myapp D/TextView: setTypeface with style : 0
11-30 14:30:54.200 5380-5380/net.droid5d.myapp D/ViewRootImpl@3cea6e2[SplashScreen]: ThreadedRenderer.create() translucent=false
11-30 14:30:54.203 5380-5380/net.droid5d.myapp D/InputTransport: Input channel constructed: fd=69
11-30 14:30:54.203 5380-5380/net.droid5d.myapp D/ViewRootImpl@3cea6e2[SplashScreen]: setView = DecorView@aa21a73[SplashScreen] touchMode=true
11-30 14:30:54.208 5380-5380/net.droid5d.myapp D/ViewRootImpl@3cea6e2[SplashScreen]: dispatchAttachedToWindow
11-30 14:30:54.225 5380-5380/net.droid5d.myapp V/Surface: sf_framedrop debug : 0x4f4c, game : false, logging : 0
11-30 14:30:54.225 5380-5380/net.droid5d.myapp D/ViewRootImpl@3cea6e2[SplashScreen]: Relayout returned: oldFrame=[0,0][0,0] newFrame=[0,0][1440,2960] result=0x27 surface={isValid=true 529685839872} surfaceGenerationChanged=true
11-30 14:30:54.225 5380-5380/net.droid5d.myapp D/ViewRootImpl@3cea6e2[SplashScreen]: mHardwareRenderer.initialize() mSurface={isValid=true 529685839872} hwInitialized=true
11-30 14:30:54.259 5380-5408/net.droid5d.myapp D/libEGL: loaded /vendor/lib64/egl/libGLES_mali.so
11-30 14:30:54.274 5380-5408/net.droid5d.myapp I/OpenGLRenderer: Initialized EGL, version 1.4
11-30 14:30:54.274 5380-5408/net.droid5d.myapp D/OpenGLRenderer: Swap behavior 1
11-30 14:30:54.278 5380-5408/net.droid5d.myapp D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000,  [1440x2960]-format:1
11-30 14:30:54.303 5380-5380/net.droid5d.myapp D/ViewRootImpl@3cea6e2[SplashScreen]: MSG_RESIZED_REPORT: frame=Rect(0, 0 - 1440, 2960) ci=Rect(0, 84 - 0, 168) vi=Rect(0, 84 - 0, 168) or=١
11-30 14:30:54.303 5380-5380/net.droid5d.myapp D/ViewRootImpl@3cea6e2[SplashScreen]: MSG_WINDOW_FOCUS_CHANGED 1
11-30 14:30:54.303 5380-5380/net.droid5d.myapp D/ViewRootImpl@3cea6e2[SplashScreen]: mHardwareRenderer.initializeIfNeeded()#2 mSurface={isValid=true 529685839872}
11-30 14:30:54.304 5380-5380/net.droid5d.myapp V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@49264c7 nm : net.droid5d.myapp ic=null
11-30 14:30:54.304 5380-5380/net.droid5d.myapp I/InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus
11-30 14:30:54.310 5380-5400/net.droid5d.myapp D/InputTransport: Input channel constructed: fd=79
11-30 14:30:54.313 5380-5380/net.droid5d.myapp V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@5f3baf4 nm : net.droid5d.myapp ic=null
11-30 14:30:55.666 5380-5380/net.droid5d.myapp D/ViewRootImpl@3cea6e2[SplashScreen]: ViewPostImeInputStage processPointer 0
11-30 14:30:55.775 5380-5380/net.droid5d.myapp D/ViewRootImpl@3cea6e2[SplashScreen]: ViewPostImeInputStage processPointer 1
11-30 14:30:55.800 5380-5380/net.droid5d.myapp D/ViewRootImpl@3cea6e2[SplashScreen]: MSG_WINDOW_FOCUS_CHANGED 0
11-30 14:30:55.814 5380-5380/net.droid5d.myapp V/ActivityThread: performLaunchActivity: mActivityCurrentConfig={0 1.0 themeSeq = 0 showBtnBg = 0 422mcc2mnc [ar_AE,en_US] ldrtl sw411dp w411dp h773dp 560dpi nrml long port ?dc finger -keyb/v/h -nav/h mkbd/h desktop/d s.8}
11-30 14:30:55.824 5380-5380/net.droid5d.myapp D/TextView: setTypeface with style : 0
11-30 14:30:55.824 5380-5380/net.droid5d.myapp D/TextView: setTypeface with style : 0
11-30 14:30:55.828 5380-5380/net.droid5d.myapp D/ScrollView: initGoToTop
11-30 14:30:55.830 5380-5380/net.droid5d.myapp D/TextView: setTypeface with style : 0
11-30 14:30:55.832 5380-5380/net.droid5d.myapp D/TextView: setTypeface with style : 0
11-30 14:30:55.833 5380-5380/net.droid5d.myapp D/TextView: setTypeface with style : 0
11-30 14:30:55.835 5380-5380/net.droid5d.myapp D/TextView: setTypeface with style : 0
11-30 14:30:55.835 5380-5380/net.droid5d.myapp D/TextView: setTypeface with style : 0
11-30 14:30:55.846 5380-5380/net.droid5d.myapp D/ViewRootImpl@65a66bb[MainActivity]: ThreadedRenderer.create() translucent=false
11-30 14:30:55.848 5380-5380/net.droid5d.myapp D/InputTransport: Input channel constructed: fd=84
11-30 14:30:55.848 5380-5380/net.droid5d.myapp D/ViewRootImpl@65a66bb[MainActivity]: setView = DecorView@f6ce7d8[MainActivity] touchMode=true
11-30 14:30:55.850 5380-5380/net.droid5d.myapp D/ViewRootImpl@65a66bb[MainActivity]: dispatchAttachedToWindow
11-30 14:30:55.874 5380-5380/net.droid5d.myapp V/Surface: sf_framedrop debug : 0x4f4c, game : false, logging : 0
11-30 14:30:55.875 5380-5380/net.droid5d.myapp D/ViewRootImpl@65a66bb[MainActivity]: Relayout returned: oldFrame=[0,0][0,0] newFrame=[0,0][1440,2960] result=0x27 surface={isValid=true 529815250432} surfaceGenerationChanged=true
11-30 14:30:55.875 5380-5380/net.droid5d.myapp D/ViewRootImpl@65a66bb[MainActivity]: mHardwareRenderer.initialize() mSurface={isValid=true 529815250432} hwInitialized=true
11-30 14:30:55.877 5380-5408/net.droid5d.myapp D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000,  [1440x2960]-format:1
11-30 14:30:55.877 5380-5380/net.droid5d.myapp D/ScrollView:  onsize change changed 
11-30 14:30:55.906 5380-5380/net.droid5d.myapp D/ViewRootImpl@65a66bb[MainActivity]: MSG_RESIZED_REPORT: frame=Rect(0, 0 - 1440, 2960) ci=Rect(0, 84 - 0, 168) vi=Rect(0, 84 - 0, 168) or=١
11-30 14:30:55.906 5380-5380/net.droid5d.myapp D/ViewRootImpl@65a66bb[MainActivity]: MSG_WINDOW_FOCUS_CHANGED 1
11-30 14:30:55.906 5380-5380/net.droid5d.myapp D/ViewRootImpl@65a66bb[MainActivity]: mHardwareRenderer.initializeIfNeeded()#2 mSurface={isValid=true 529815250432}
11-30 14:30:55.907 5380-5380/net.droid5d.myapp V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@2b0f233 nm : net.droid5d.myapp ic=null
11-30 14:30:55.907 5380-5380/net.droid5d.myapp I/InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus
11-30 14:30:55.917 5380-5380/net.droid5d.myapp D/InputTransport: Input channel constructed: fd=81
11-30 14:30:55.917 5380-5380/net.droid5d.myapp D/InputTransport: Input channel destroyed: fd=79
11-30 14:30:55.974 5380-5408/net.droid5d.myapp D/OpenGLRenderer: endAllActiveAnimators on 0x7b5b67dc00 (RippleDrawable) with handle 0x7b53a971e0
11-30 14:30:55.974 5380-5380/net.droid5d.myapp D/ViewRootImpl@3cea6e2[SplashScreen]: mHardwareRenderer.destroy()#1
11-30 14:30:55.978 5380-5380/net.droid5d.myapp D/ViewRootImpl@3cea6e2[SplashScreen]: Relayout returned: oldFrame=[0,0][1440,2960] newFrame=[0,0][1440,2960] result=0x5 surface={isValid=false 0} surfaceGenerationChanged=true
11-30 14:30:56.370 5380-5380/net.droid5d.myapp D/ViewRootImpl@65a66bb[MainActivity]: ViewPostImeInputStage processPointer 0
11-30 14:30:56.479 5380-5380/net.droid5d.myapp D/ViewRootImpl@65a66bb[MainActivity]: ViewPostImeInputStage processPointer 1
11-30 14:30:56.485 5380-5380/net.droid5d.myapp D/TextView: setTypeface with style : 0
11-30 14:30:56.492 5380-5380/net.droid5d.myapp D/ScrollView: initGoToTop
11-30 14:30:56.494 5380-5380/net.droid5d.myapp D/TextView: setTypeface with style : 0
11-30 14:30:56.496 5380-5380/net.droid5d.myapp D/ScrollView: initGoToTop
11-30 14:30:56.498 5380-5380/net.droid5d.myapp D/TextView: setTypeface with style : 0
11-30 14:30:56.499 5380-5380/net.droid5d.myapp D/TextView: setTypeface with style : 0
11-30 14:30:56.500 5380-5380/net.droid5d.myapp D/TextView: setTypeface with style : 0
11-30 14:30:56.503 5380-5380/net.droid5d.myapp D/ViewRootImpl@86b8613[MainActivity]: ThreadedRenderer.create() translucent=true
11-30 14:30:56.506 5380-5380/net.droid5d.myapp D/InputTransport: Input channel constructed: fd=76
11-30 14:30:56.506 5380-5380/net.droid5d.myapp D/ViewRootImpl@86b8613[MainActivity]: setView = DecorView@e541050[MainActivity] touchMode=true
11-30 14:30:56.507 5380-5380/net.droid5d.myapp D/ViewRootImpl@86b8613[MainActivity]: dispatchAttachedToWindow
11-30 14:30:56.509 5380-5442/net.droid5d.myapp D/NetworkSecurityConfig: No Network Security Config specified, using platform default
11-30 14:30:56.510 5380-5442/net.droid5d.myapp I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
11-30 14:30:56.510 5380-5442/net.droid5d.myapp I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
11-30 14:30:56.513 5380-5442/net.droid5d.myapp D/TcpOptimizer: TcpOptimizer-ON
11-30 14:30:56.524 5380-5380/net.droid5d.myapp V/Surface: sf_framedrop debug : 0x4f4c, game : false, logging : 0
11-30 14:30:56.525 5380-5380/net.droid5d.myapp D/ViewRootImpl@86b8613[MainActivity]: Relayout returned: oldFrame=[0,0][0,0] newFrame=[37,1235][1403,1641] result=0x27 surface={isValid=true 529685839872} surfaceGenerationChanged=true
11-30 14:30:56.525 5380-5380/net.droid5d.myapp D/ViewRootImpl@86b8613[MainActivity]: mHardwareRenderer.initialize() mSurface={isValid=true 529685839872} hwInitialized=true
11-30 14:30:56.526 5380-5408/net.droid5d.myapp D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000,  [1590x630]-format:1
11-30 14:30:56.526 5380-5380/net.droid5d.myapp D/ViewRootImpl@86b8613[MainActivity]: MSG_WINDOW_FOCUS_CHANGED 1
11-30 14:30:56.526 5380-5380/net.droid5d.myapp D/ViewRootImpl@86b8613[MainActivity]: mHardwareRenderer.initializeIfNeeded()#2 mSurface={isValid=true 529685839872}
11-30 14:30:56.536 5380-5380/net.droid5d.myapp D/ViewRootImpl@86b8613[MainActivity]: MSG_RESIZED_REPORT: frame=Rect(37, 1235 - 1403, 1641) ci=Rect(0, 0 - 0, 0) vi=Rect(0, 0 - 0, 0) or=١
11-30 14:30:56.555 5380-5380/net.droid5d.myapp D/ViewRootImpl@65a66bb[MainActivity]: MSG_WINDOW_FOCUS_CHANGED 0
11-30 14:31:14.568 5380-5380/net.droid5d.myapp D/ViewRootImpl@86b8613[MainActivity]: ViewPostImeInputStage processPointer 0
11-30 14:31:14.725 5380-5380/net.droid5d.myapp D/ViewRootImpl@86b8613[MainActivity]: ViewPostImeInputStage processPointer 1
11-30 14:31:22.942 5380-5442/net.droid5d.myapp E/MainActivity: Update Error: file:///storage/emulated/0/Download/app-debug.apk exposed beyond app through Intent.getData()
11-30 14:31:22.984 5380-5380/net.droid5d.myapp D/ViewRootImpl@86b8613[MainActivity]: mHardwareRenderer.destroy()#4
11-30 14:31:22.984 5380-5380/net.droid5d.myapp D/ViewRootImpl@86b8613[MainActivity]: dispatchDetachedFromWindow
11-30 14:31:22.997 5380-5380/net.droid5d.myapp D/InputTransport: Input channel destroyed: fd=76
11-30 14:31:22.998 5380-5380/net.droid5d.myapp W/SemDesktopModeManager: unregisterListener: Listener is null
11-30 14:31:23.019 5380-5380/net.droid5d.myapp D/ViewRootImpl@65a66bb[MainActivity]: MSG_WINDOW_FOCUS_CHANGED 1
11-30 14:31:23.020 5380-5380/net.droid5d.myapp D/ViewRootImpl@65a66bb[MainActivity]: mHardwareRenderer.initializeIfNeeded()#2 mSurface={isValid=true 529815250432}
11-30 14:31:23.022 5380-5380/net.droid5d.myapp E/ViewRootImpl: sendUserActionEvent() returned.
11-30 14:31:23.039 5380-5380/net.droid5d.myapp D/InputTransport: Input channel constructed: fd=80
11-30 14:31:23.040 5380-5380/net.droid5d.myapp D/ViewRootImpl@89d4f57[Toast]: setView = android.widget.LinearLayout{d717a44 V.E...... ......I. 0,0-0,0} touchMode=true
11-30 14:31:23.040 5380-5380/net.droid5d.myapp V/Toast: Text: Frro in android.widget.Toast$TN@129f72d
11-30 14:31:23.045 5380-5380/net.droid5d.myapp D/ViewRootImpl@89d4f57[Toast]: dispatchAttachedToWindow
11-30 14:31:23.072 5380-5380/net.droid5d.myapp V/Surface: sf_framedrop debug : 0x4f4c, game : false, logging : 0
11-30 14:31:23.073 5380-5380/net.droid5d.myapp D/ViewRootImpl@89d4f57[Toast]: Relayout returned: oldFrame=[0,0][0,0] newFrame=[443,2407][996,2568] result=0x27 surface={isValid=true 529685839872} surfaceGenerationChanged=true
11-30 14:31:23.075 5380-5380/net.droid5d.myapp D/ViewRootImpl@89d4f57[Toast]: MSG_RESIZED_REPORT: frame=Rect(443, 2407 - 996, 2568) ci=Rect(0, 0 - 0, 0) vi=Rect(0, 0 - 0, 0) or=١
11-30 14:31:25.028 5380-5380/net.droid5d.myapp D/ViewRootImpl@89d4f57[Toast]: dispatchDetachedFromWindow
11-30 14:31:25.040 5380-5380/net.droid5d.myapp D/InputTransport: Input channel destroyed: fd=80
11-30 14:31:25.040 5380-5380/net.droid5d.myapp W/SemDesktopModeManager: unregisterListener: Listener is null
11-30 14:31:55.035 5380-5380/net.droid5d.myapp V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@1fc2462 nm : net.droid5d.myapp ic=null
11-30 14:31:55.035 5380-5380/net.droid5d.myapp I/InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus
11-30 14:31:55.038 5380-5380/net.droid5d.myapp D/InputTransport: Input channel constructed: fd=80
11-30 14:31:55.039 5380-5380/net.droid5d.myapp D/InputTransport: Input channel destroyed: fd=81
11-30 14:32:00.732 5380-5380/net.droid5d.myapp D/ViewRootImpl@65a66bb[MainActivity]: MSG_WINDOW_FOCUS_CHANGED 0

您可以使用广播接收器尝试以下操作:

//broadcast receiver to get notification about ongoing downloads
    private BroadcastReceiver downloadReceiver = new BroadcastReceiver() {

        @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 {
                    //start the installation of the latest version
                    Uri uri;
                    Cursor q = downloadManager.query(new DownloadManager.Query().setFilterById(downloadReference));
                    if ( q == null ) {
                        Toast.makeText(context,
                                "FAILED: Unable to read downloaded file" ,
                                Toast.LENGTH_LONG).show();
                    }
                    q.moveToFirst();
                    String path = "file://" + q.getString(q.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
                    uri = Uri.parse(path);

                    intent = new Intent(Intent.ACTION_VIEW);
                    intent.setDataAndType(uri, downloadManager.getMimeTypeForDownloadedFile(downloadReference));
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    if (intent != null) {
                        startActivity(intent);
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(), "App download failed.", Toast.LENGTH_SHORT).show();
                }
            }
        }
    };

对于注册广播下载:

//Broadcast receiver for the download manager
        IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
        registerReceiver(downloadReceiver, filter);

并下载asyncTask,例如:

    ProgressDialog progressDialog;
    DownloadManager downloadManager;

    class DownloadApkTask extends AsyncTask<Void, Void, Void> {
        @Override
        protected void onCancelled() {
            File file = new File(String.valueOf(downloadManager.getUriForDownloadedFile(downloadReference)));
            file.delete();
        }

        @Override
        protected void onPreExecute() {
            progressDialog = new ProgressDialog(context);
            progressDialog.setMessage(MessageConstant.LOADING);
            progressDialog.setCancelable(false);
            progressDialog.setCanceledOnTouchOutside(false);
            progressDialog.show();
        }

        @Override
        protected Void doInBackground(Void... voids) {
            try {
                downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                Uri Download_Uri = Uri.parse(loginResponse.getAppUpgradeUrl());
                DownloadManager.Request request = new DownloadManager.Request(Download_Uri);
                if (AppUtil.isConnectedMobile()) {
                    request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE);
                } else if (AppUtil.isConnectedWifi()) {
                    request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
                }
                request.setAllowedOverRoaming(false);
                request.setTitle("App Download");
                request.setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS, "DemoApp.apk");
                downloadReference = downloadManager.enqueue(request);

            } catch (Exception e) {

                e.printStackTrace();

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(context, "An error occured during download. Please try again", Toast.LENGTH_SHORT).show();
                    }
                });
            }
            return null;
        }
    }
MainActivity: Update Error: file:///storage/emulated/0/Download/app-debug.apk 
  exposed beyond app through Intent.getData()

这是在Android 7+上吗?

如果是这样, FileUriExposedException使用google并使用FileProvider

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM