Download a file programmatically on Android

后端 未结 5 578
猫巷女王i
猫巷女王i 2020-11-28 04:43

I am downloading files from web server programmatically. After download is completed, I checked the file. The size ,extension and all other parameters are correct but when I

相关标签:
5条回答
  • 2020-11-28 04:53

    read on an input stream doesn't guarntee that the entire contents of the file will be pulled down in one go. Check the return value on that in.read(b); line. It might look something like this:

    if(in.read(b) != size)
        Log.e("Network","Failed to read all data!");
    

    That'll tell you, at the very least, if you're getting all your data from the networking layer. If you only got a partial read, but you're still writing the full byte array to disk, that might explain why the media player thinks the file is corrupt.

    0 讨论(0)
  • 2020-11-28 04:55

    I checked this stackoverflow question but it looks like there is not a download Intent.

    Did you try setting the WRITE_EXTERNAL_STORAGE in the android manifest?

    0 讨论(0)
  • 2020-11-28 05:09
    private void down(String string)
        {
    
            try
            {
                URL url = new URL(URL);
                HttpURLConnection c = (HttpURLConnection) url.openConnection();
                c.setRequestMethod("GET");
                c.setDoOutput(true);
                c.connect();
    
                String PATH = Environment.getExternalStorageDirectory().toString()
                        + "/load";
                Log.v("LOG_TAG", "PATH: " + PATH);
    
                File file = new File(PATH);
                file.mkdirs();
                File outputFile = new File(file, option14[i].toString());
                FileOutputStream fos = new FileOutputStream(outputFile);
                InputStream is = c.getInputStream();
    
                byte[] buffer = new byte[4096];
                int len1 = 0;
    
                while ((len1 = is.read(buffer)) != -1)
                {
                    fos.write(buffer, 0, len1);
                }
    
                fos.close();
                is.close();
    
                Toast.makeText(this, " A new file is downloaded successfully",
                        Toast.LENGTH_LONG).show();
    
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
    
        }
    
    0 讨论(0)
  • 2020-11-28 05:10

    This is some working code I have for downloading a given URL to a given File object. The File object (outputFile) has just been created using new File(path), I haven't called createNewFile or anything.

    private static void downloadFile(String url, File outputFile) {
      try {
          URL u = new URL(url);
          URLConnection conn = u.openConnection();
          int contentLength = conn.getContentLength();
    
          DataInputStream stream = new DataInputStream(u.openStream());
    
            byte[] buffer = new byte[contentLength];
            stream.readFully(buffer);
            stream.close();
    
            DataOutputStream fos = new DataOutputStream(new FileOutputStream(outputFile));
            fos.write(buffer);
            fos.flush();
            fos.close();
      } catch(FileNotFoundException e) {
          return; // swallow a 404
      } catch (IOException e) {
          return; // swallow a 404
      }
    }
    
    0 讨论(0)
  • 2020-11-28 05:15

    Permission

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
    

    Download Fuction Code

     public void downloadFile() {
            String DownloadUrl = audio1;
            DownloadManager.Request request1 = new DownloadManager.Request(Uri.parse(DownloadUrl));
            request1.setDescription("Sample Music File");   //appears the same in Notification bar while downloading
            request1.setTitle("File1.mp3");
            request1.setVisibleInDownloadsUi(false);
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                request1.allowScanningByMediaScanner();
                request1.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);
            }
            request1.setDestinationInExternalFilesDir(getApplicationContext(), "/File", "Question1.mp3");
    
            DownloadManager manager1 = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
            Objects.requireNonNull(manager1).enqueue(request1);
            if (DownloadManager.STATUS_SUCCESSFUL == 8) {
            DownloadSuccess(); 
            }
        }
    
    0 讨论(0)
提交回复
热议问题