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
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.
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?
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();
}
}
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
}
}
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();
}
}