android: загрузка файла в фоновом режиме

#android

#Android

Вопрос:

Я хочу загрузить файл из Интернета и сохранить во внешней памяти.Главное, что он должен быть загружен в фоновом режиме, как market, при нажатии на install он загрузит файл apk.если у кого-то есть какие-либо идеи, пожалуйста, скажите мне

Спасибо.

Ответ №1:

это еще один код для загрузки файла с помощью задачи Asyc с уведомлением о подсчете

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

это помощник по уведомлению

 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);
    }
}
  

Спасибо.

Комментарии:

1. Это очень неправильно: onProgressUpdate((int)((total*100)/lenghtOfFile)); . Вы вызываете метод из рабочего потока, а не из потока пользовательского интерфейса. Используйте publishProgress() вместо этого.

Ответ №2:

Если ваше приложение использует 2.3, то вы можете использовать DownloadManager api, предоставляемый Android SDK. В противном случае вы можете написать свой собственный сервис для этой цели.

Комментарии:

1. Я могу, пожалуйста, сказать мне, как реализовать DownloadManager в 2.1 и 2.2, у меня есть работа с сервисами, но я не знал, как загрузить файл, если есть какая-либо ссылка, пожалуйста, пришлите мне

2. DownloadManager доступен только начиная с версии 2.3. ИТАК, для более низких версий api используйте ссылку, предоставленную Chirag.

Ответ №3:

поскольку Android имеет открытый исходный код, вы можете просто перенести DownloadManager в Android 2.3 на более низкую версию Android

Ответ №4:

Пожалуйста, найдите эту ссылку. В нем объясняется, как загрузить файл из Интернета. Вы должны поместить этот код в поток. Он используется для фонового процесса. Вы должны обратиться к потоку для фоновых процессов или использовать AsyncTask, который также используется для фонового процесса.