簡體   English   中英

如何從內部存儲文件安裝應用程序

[英]how to install an app from internal storage files

我正在嘗試下載apk文件然后安裝它。
我已經使用外部存儲目錄完成了它,但是當我在本地目錄中下載文件時,我無法解析它。

這是OnCreate方法的代碼

final DownloadTask downloadTask = new DownloadTask(this);       
downloadTask.execute("http://file.appsapk.com/wp-content/uploads/apps-2/Gmail.apk","Gmail.apk");

DownloadTask是一個從AsyncTask擴展而來的類。 這是后台任務:

@Override
    protected String doInBackground(String... sUrl) {
        file_name=sUrl[1];
        Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
        if (isSDPresent) {
            directory = new File(Environment.getExternalStorageDirectory()+File.separator+"app_directory");
        }
        else
        {
            directory = getFilesDir();

        }
        if (!directory.exists()) 
            directory.mkdirs();
        InputStream input = null;
        OutputStream output = null;
        HttpURLConnection connection = null;
        try {
            URL url = new URL(sUrl[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
                return "Server returned HTTP " + connection.getResponseCode()
                        + " " + connection.getResponseMessage();
            }

            int fileLength = connection.getContentLength();
            input = connection.getInputStream();
            output = new FileOutputStream(directory+"/"+file_name);
            byte[] buffer = new byte[1024];
            long total = 0;
            int count;
            while ((count = input.read(buffer)) != -1) {
                if (isCancelled()) {
                    input.close();
                    return null;
                }
                total += count;
                if (fileLength > 0) // only if total length is known
                    publishProgress((int) (total * 100 / fileLength));
                output.write(buffer, 0, count);
            }
        } catch (Exception e) {
            return e.toString();
        } finally {
            try {
                if (input != null)
                    input.close();

                if (output != null)
                    output.close();
            } catch (IOException ignored) {
            }

            if (connection != null)
                connection.disconnect();
        }
        return null;
    }

這是在第一個完成下載文件后運行的后執行方法:

   @Override
    protected void onPostExecute(String result) {
        mWakeLock.release();
        mProgressDialog.dismiss();
        if (result != null)
        {
            Toast.makeText(context,"Download error: "+result, Toast.LENGTH_LONG).show();
        }
        else
        {
            Toast.makeText(context, "File downloaded", Toast.LENGTH_SHORT).show();
            File file = new File(directory, file_name);
            Intent promptInstall = new Intent(Intent.ACTION_VIEW)
                .setDataAndType(Uri.fromFile(file),
                        "application/vnd.android.package-archive");
           context.startActivity(promptInstall);
           finish();

        }

它與外部存儲完美匹配,但不能與外部存儲一起運行。 為什么不?

嘗試使用openfileoutput()而不是OutputStream將文件保存在內部存儲中並允許其可讀。 http://developer.android.com/guide/topics/data/data-storage.html#filesInternal 包錯誤主要是由內部存儲的許可引起的。

這是因為android應用程序無法從另一個應用程序文件讀取,如果它是使用PRIVATE模式編寫的。所以你必須改變文件的模式。 我剛剛修改了下面的onPostExecute()方法的其他部分。

    try {
        String tempfile="xyzfile";
        File file = new File(directory, file_name);
        FileInputStream inStream = new FileInputStream(file);
        FileOutputStream fos = context.openFileOutput(tempfile,
                context.MODE_WORLD_WRITEABLE | context.MODE_WORLD_READABLE);

        byte[] buffer = new byte[1024];
        int length;
        // copy the file content in bytes
        while ((length = inStream.read(buffer)) > 0) {

            fos.write(buffer, 0, length);

        }
        inStream.close();
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    File file = new File(context.getFilesDir(), tempfile);
    Intent promptInstall = new Intent(Intent.ACTION_VIEW).setDataAndType(
            Uri.fromFile(file), "application/vnd.android.package-archive");
    context.startActivity(promptInstall);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM