Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android download large files

I'm trying to download a large .zip file from a web server but I have a weird behaviour, the description is:

  • I'm executing the code in the device emulator, API level 3 (version 1.5) with an SD card of 512MB. I start the device with "Wipe data user"
  • The length of the size from conexion.getContentLength() is 7012725
  • The server address is localhost (10.0.2.2), but I've tried with an external server and the behaviour is the same. I've double checked that I can download the file through a web browser.
  • I have these permisions in the manifest file:

-

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

The error:

  • It starts downloading the file, I can see the text 10, 20, 30, 40, 50 and then it stops at 60.
  • After a while, the emulator reboots itself.

Workarounds:

  • This issue in stackoverflow is working in the device, not in my case.
  • About this wifi lock issue what I've done is add this permission "android.permission.WAKE_LOCK" and then this piece of code, but with exactly the same behaviour:

    WifiManager.WifiLock wifilock; WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE); wifilock = manager.createWifiLock("wifilock"); wifilock.acquire(); ... wifilock.release();

Here is the code, that it's being executing in a separate thread:

private void downloadData(){
    try{
        Log.v(TAG, "downloading data");

        URL url  = new URL("http://10.0.2.2/1.zip");
        URLConnection connection = url.openConnection();
        connection.connect();

        int lenghtOfFile = connection.getContentLength();

        Log.v(TAG, "lenghtOfFile = "+lenghtOfFile);

        InputStream is = url.openStream();

        File testDirectory = new File(Environment.getExternalStorageDirectory()+"/testDirectory/");
    if(!testDirectory.exists()){
        testDirectory.mkdir();
    }

        FileOutputStream fos = new FileOutputStream(testDirectory+"/files.zip");

        byte data[] = new byte[1024];

        int count = 0;
        long total = 0;
        int progress = 0;

        while ((count=is.read(data)) != -1)
        {
            total += count;
            int progress_temp = (int)total*100/lenghtOfFile;
            if(progress_temp%10 == 0 && progress != progress_temp){
                progress = progress_temp;
                Log.v(TAG, "total = "+progress);    
            }
            fos.write(data, 0, count);
        }

        is.close();
        fos.close();

    Log.v(TAG, "downloading finished");

    }catch(Exception e){
        Log.v(TAG, "exception in downloadData");
        e.printStackTrace();
    }

}

Any clue? Thank you very much.

Update with more log description:

Hi Chris, I've tried to discover what was going on at first with this log in the Eclipse environment. Here are a little bit more detail about what is happening (time - action), note that I've changed the file to download for another one in orther to do more tests, but the results are quite the same:

00:00 It starts downloading:
V/iPhoto  (  853): downloading data
V/iPhoto  (  853): lenghtOfFile = 7732809
V/iPhoto  (  853): total = 10
V/iPhoto  (  853): total = 20
V/iPhoto  (  853): total = 30
V/iPhoto  (  853): total = 40
V/iPhoto  (  853): total = 50 (round 00:05)
-> Here it stops and the DDMS disconnects the device immediately

03:40 It finish the download (not always) and the device reboots on its own:
I/Process (  595): Sending signal. PID: 595 SIG: 3
I/dalvikvm(  595): threadid=7: reacting to signal 3
D/dalvikvm(  722): GC freed 2193 objects / 135808 bytes in 176 sec
V/iPhoto  (  853): total = 60
I/dalvikvm(  595): Wrote stack trace to '/data/anr/traces.txt'
I/ActivityManager(  595): Process com.google.android.apps.maps:FriendService (pid 778) has died.
I/ActivityManager(  595): Process com.android.mms (pid 732) has died.
V/iPhoto  (  853): total = 70
V/iPhoto  (  853): total = 80
V/iPhoto  (  853): total = 90
V/iPhoto  (  853): total = 100
V/iPhoto  (  853): downloading finished
V/iPhoto  (  853): thread finish loading
I/Process (  595): Sending signal. PID: 595 SIG: 9
I/ActivityThread(  757): Removing dead content provider: settings
I/ActivityThread(  748): Removing dead content provider: settings
I/ActivityThread(  722): Removing dead content provider: settings
I/ActivityThread(  700): Removing dead content provider: settings
I/ServiceManager(  549): service 'package' died
... services dying...
I/ServiceManager(  549): service 'wifi' died
E/installd(  557): eof
E/installd(  557): failed to read size
I/installd(  557): closing connection
D/qemud   (  560): fdhandler_event: disconnect on fd 11
D/qemud   (  560): fdhandler_event: disconnect on fd 12
E/vold    (  550): Framework disconnected
I/Zygote  (  554): Exit zygote because system server (595) has terminated
I/ServiceManager(  549): service 'simphonebook' died
I/ServiceManager(  549): service 'isms' died
I/ServiceManager(  549): service 'iphonesubinfo' died
I/ServiceManager(  549): service 'phone' died
D/AndroidRuntime(  949): 
D/AndroidRuntime(  949): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
... and starting ...

Could anyone try my code and to download a zip file with size round 8MB? Does it works for you?

like image 236
zegnus Avatar asked Oct 27 '10 09:10

zegnus


People also ask

How can I download files larger than 4GB on Android?

Please make sure that your storage location is saved as an SD card in the settings in our app. If you want to download files larger than 4GB, please change the storage location to internal storage or please transfer after dividing files smaller than 4GB. Then you will be able to download them.

How can I download big files faster on Android?

Install the AndroGET app from the Android Market. Launch it and tap the gear-shaped Settings icon in the top right. The simple settings are pretty good for most users, but you can easily change the default save folder, number of simultaneous downloads, and notifications. Tap Advanced to change proxy settings and more.

How can I download a file greater than 4GB to a smartphone?

You need to format your sd card using a filesystem that has a larger per-file size limit. NTFS is suggested in another answer but Android does not natively support it. You could try exfat format which is supported by both Windows and Android, so there won't be problems mounting your sdcard on your PC.


2 Answers

I've just tried this code in a real device and it works perfectly. There must be something weird in the emulator.

like image 145
zegnus Avatar answered Oct 16 '22 03:10

zegnus


The "emulator rebooting itself" does not sound good. I would recommend you start up logcat on the dev machine and log to a file... ie, on a linux dev machine something like

adb logcat | tee logfile

Then look at the logfile and see what you can learn about why it rebooted.

like image 42
Chris Stratton Avatar answered Oct 16 '22 04:10

Chris Stratton