2011-04-26 14 views
8

Quiero descargar el archivo de internet y almacenarlo en la memoria externa. Lo principal es que debe descargarse en segundo plano como en el mercado, cuando haga clic en instalar, descargará el archivo apk.si alguno Tengo alguna idea, por favor dimeandroid: descarga de archivos en el fondo

Gracias.

Respuesta

-2

Por favor, find este enlace. Explica cómo descargar un archivo de internet. Tienes que poner este código en un hilo. Se usa para el proceso en segundo plano. Debe consultar la secuencia de procesos en segundo plano o utilizar AsyncTask, que también se utiliza para el proceso en segundo plano.

+3

El enlace está roto. 404. –

+1

el enlace no funciona. proporcione la solución aquí –

+0

He actualizado el enlace. –

6

Si su aplicación utiliza 2.3, puede usar la API DownloadManager proporcionada en el SDK de Android. De lo contrario, puede escribir su propio service para este fin.

+0

Puedo decirme cómo implementar el DownloadManager en 2.1 y 2.2, tengo trabajo con servicios pero no sabía cómo descargar el archivo, si tiene algún enlace, por favor envíeme –

+0

DownloadManager está disponible solo a partir de 2.3 en adelante . SO para versiones de api más bajas usa el enlace provisto por Chirag. – mudit

0

como Android es de código abierto, que sólo puede portar DownloadManager en Android 2.3 a una versión más baja androide

10

este es el otro código de downloaf archivo usando la tarea ASYC con countinues notificación

public class DownloadTask extends AsyncTask<Integer, Integer, Void>{ 
    private NotificationHelper mNotificationHelper; 

    private static final String PEFERENCE_FILE = "preference"; 
    private static final String ISDOWNLOADED = "isdownloaded"; 
    SharedPreferences settings; 
    SharedPreferences.Editor editor; 
    Context context; 
    public DownloadTask(Context context){ 
     this.context = context; 
     mNotificationHelper = new NotificationHelper(context); 
    } 

    protected void onPreExecute(){ 
     //Create the notification in the statusbar 
     mNotificationHelper.createNotification(); 
    } 

    @Override 
    protected Void doInBackground(Integer... integers) { 
     //This is where we would do the actual download stuff 
     //for now I'm just going to loop for 10 seconds 
     // publishing progress every second 

     int count; 

     try { 


     URL url = new URL("filename url"); 
     URLConnection connexion = url.openConnection(); 
     connexion.connect(); 

     int lenghtOfFile = connexion.getContentLength(); 
     Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile); 

     InputStream input = new BufferedInputStream(url.openStream()); 
     //OutputStream output = new FileOutputStream("/sdcard/foldername/temp.zip"); 
     OutputStream output = new FileOutputStream("/sdcard/foldername/himages.zip"); 
     byte data[] = new byte[1024]; 

     long total = 0; 

      while ((count = input.read(data)) != -1) { 
       total += count; 
       //publishProgress(""+(int)((total*100)/lenghtOfFile)); 
       Log.d("%Percentage%",""+(int)((total*100)/lenghtOfFile)); 
       onProgressUpdate((int)((total*100)/lenghtOfFile)); 
       output.write(data, 0, count); 
      } 

      output.flush(); 
      output.close(); 
      input.close(); 
      File file = new File(Environment.getExternalStorageDirectory() 
        + "/foldername/"+"_images.zip"); 
      File path = new File(Environment.getExternalStorageDirectory() 
        + "/foldername"); 
       try { 
         ZipUtil.unzip(file,path); 
         settings = this.context.getSharedPreferences(PEFERENCE_FILE, 0); 
         editor = settings.edit(); 
         editor.putBoolean(ISDOWNLOADED, true); 
         editor.commit(); 

       } catch (IOException e) { 
         Log.d("ZIP UTILL",e.toString()); 
        } 

     } catch (Exception e) {} 


     return null; 
    } 
    protected void onProgressUpdate(Integer... progress) { 
     //This method runs on the UI thread, it receives progress updates 
     //from the background thread and publishes them to the status bar 
     mNotificationHelper.progressUpdate(progress[0]); 
    } 
    protected void onPostExecute(Void result) { 
     //The task is complete, tell the status bar about it 
     HyundaiApplication.serviceState=false; 
     mNotificationHelper.completed(); 
    } 
} 

esto el notificación ayudante

public class NotificationHelper { 
    private Context mContext; 
    private int NOTIFICATION_ID = 1; 
    private Notification mNotification; 
    private NotificationManager mNotificationManager; 
    private PendingIntent mContentIntent; 
    private CharSequence mContentTitle; 
    public NotificationHelper(Context context) 
    { 
     mContext = context; 
    } 

    /** 
    * Put the notification into the status bar 
    */ 
    public void createNotification() { 
     //get the notification manager 
     mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); 

     //create the notification 
     int icon = android.R.drawable.stat_sys_download; 
     CharSequence tickerText = mContext.getString(R.string.download_ticker); //Initial text that appears in the status bar 
     long when = System.currentTimeMillis(); 
     mNotification = new Notification(icon, tickerText, when); 

     //create the content which is shown in the notification pulldown 
     mContentTitle = mContext.getString(R.string.content_title); //Full title of the notification in the pull down 
     CharSequence contentText = "0% complete"; //Text of the notification in the pull down 

     //you have to set a PendingIntent on a notification to tell the system what you want it to do when the notification is selected 
     //I don't want to use this here so I'm just creating a blank one 
     Intent notificationIntent = new Intent(); 
     mContentIntent = PendingIntent.getActivity(mContext, 0, notificationIntent, 0); 

     //add the additional content and intent to the notification 
     mNotification.setLatestEventInfo(mContext, mContentTitle, contentText, mContentIntent); 

     //make this notification appear in the 'Ongoing events' section 
     mNotification.flags = Notification.FLAG_ONGOING_EVENT; 

     //show the notification 
     mNotificationManager.notify(NOTIFICATION_ID, mNotification); 
    } 

    /** 
    * Receives progress updates from the background task and updates the status bar notification appropriately 
    * @param percentageComplete 
    */ 
    public void progressUpdate(int percentageComplete) { 
     //build up the new status message 
     CharSequence contentText = percentageComplete + "% complete"; 
     //publish it to the status bar 
     mNotification.setLatestEventInfo(mContext, mContentTitle, contentText, mContentIntent); 
     mNotificationManager.notify(NOTIFICATION_ID, mNotification); 
    } 

    /** 
    * called when the background task is complete, this removes the notification from the status bar. 
    * We could also use this to add a new ‘task complete’ notification 
    */ 
    public void completed() { 
     //remove the notification from the status bar 
     mNotificationManager.cancel(NOTIFICATION_ID); 
    } 
} 

Gracias.

+3

Esto está muy mal: 'onProgressUpdate ((int) ((total * 100)/lenghtOfFile))'. Está llamando al método desde el subproceso de trabajo en lugar del subproceso de interfaz de usuario. Use 'publishProgress()' en su lugar. – JohnD

+0

-1 mal consejo, mala forma, vea el comentario de @ JohnD arriba. – mikebabcock

Cuestiones relacionadas