Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Firebase Storage.

Garder Upload actif.

    19 février 2018 à 15:38:55

    Bonjour,

    Je développe actuellement une application qui m'emmène à uploader des images sur un serveur, d'ou mon choix de Firebase storage. Actuellement tout fonctionne. Mais j'ai un soucis. Bien sure, quand je quitte la tâche, l'Upload en cour s'arrête. je voulais savoir comment il fallait procéder pour garder l'upload en cour (Un peu comme facebook, Play store etc...) pour le Notifier etc...

    Faut-il passer par un service?

    Cordialement.

    [edit]

    Bonjour,

    Je pense avoir écrit la bonne solution ce matin, pouvez vous me dre, si j'utilise les services correctement? Je suis pas très expérimenté sur Android.

    Cordialement.

    package fr.yanasoft.axipush;
    
    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.Service;
    import android.content.Intent;
    import android.graphics.BitmapFactory;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.NotificationCompat;
    import android.util.Log;
    
    import com.google.android.gms.tasks.OnFailureListener;
    import com.google.android.gms.tasks.OnSuccessListener;
    import com.google.firebase.storage.FirebaseStorage;
    import com.google.firebase.storage.OnProgressListener;
    import com.google.firebase.storage.StorageReference;
    import com.google.firebase.storage.UploadTask;
    
    /**
     * Created by Florian on 20/02/2018.
     */
    
    public class MyUploadService extends Service {
    
        private static final String TAG = "UPLOAD_SERVICE";
    
        private static final String CHANNEL_NOTIFICATION = "UPLOAD_CHANNEL";
        private static final int TASK_START = 1;
        private static final int TASK_STOP = -1;
    
        public static final String EXTRA_URI = "uri";
    
        private int     mNumTask = 0;
        private int     mNotificationIndex = 1;
    
        private FirebaseStorage mStorage;
    
        @Override
        public void onCreate() {
            super.onCreate();
            mStorage = FirebaseStorage.getInstance();
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
    
            Bundle extra = intent.getExtras();
            if(extra != null) {
                Uri uri = (Uri) extra.get(EXTRA_URI);
                if(uri != null) {
                    uplaodFileFromUri(uri);
                }
            }
            return super.onStartCommand(intent, flags, startId);
        }
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        private synchronized void changeNumberOfTask(int delta) {
    
            mNumTask += delta;
            if(mNumTask <= 0) {
                Log.d(TAG, "Stoping upload service");
                stopSelf();
            }
        }
    
        private void uplaodFileFromUri(Uri uri) {
    
            final int notificationId = mNotificationIndex++;
    
            final StorageReference storageReference =   mStorage.getReference("Pictures/" + uri.getLastPathSegment());
            final UploadTask uploadTask = storageReference.putFile(uri);
            final UploadListener uploadListener = new UploadListener(notificationId);
    
            changeNumberOfTask(TASK_START);
            startForeground(notificationId, buildProgressNotification("Waiting for upload.", 0, 0).build());
    
            uploadTask.addOnProgressListener(uploadListener);
            uploadTask.addOnSuccessListener(uploadListener);
            uploadTask.addOnFailureListener(uploadListener);
        }
    
        private NotificationCompat.Builder buildProgressNotification(String caption, long completedUnits, long totalUnits) {
    
            int percent = 0;
            int max = 0;
    
            if(totalUnits > 0) {
                max = 100;
                percent = (int) (100 * completedUnits / totalUnits);
            }
    
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this,
                    CHANNEL_NOTIFICATION);
    
            builder.setSmallIcon(R.drawable.ic_file_upload_black_24dp)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                    .setContentTitle(getString(R.string.app_name))
                    .setOngoing(true)
                    .setAutoCancel(false)
                    .setContentText(caption)
                    .setProgress(max, percent, false);
    
            return builder;
        }
    
        /*
        A faire.
        private NotificationCompat.Builder buildFinishNotification() {
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this,
                    CHANNEL_NOTIFICATION);
    
            return builder;
        }*/
    
        private void publishNotification(int id, Notification notification) {
    
            NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            if(manager != null) {
                manager.notify(id, notification);
            }
        }
    
        private void dismissNotification(int notificationId) {
    
            NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            if(manager != null) {
                manager.cancel(notificationId);
            }
        }
    
        private class UploadListener implements OnProgressListener<UploadTask.TaskSnapshot>,
                                                OnSuccessListener<UploadTask.TaskSnapshot>,
                                                OnFailureListener {
            private int notificationId = 0;
    
            UploadListener(int id) {
                notificationId = id;
            }
    
            @Override
            public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
    
                publishNotification(notificationId, buildProgressNotification("Uploading file.",
                        taskSnapshot.getBytesTransferred(),
                        taskSnapshot.getTotalByteCount()).build());
            }
    
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
    
                dismissNotification(notificationId);
                changeNumberOfTask(TASK_STOP);
            }
    
            @Override
            public void onFailure(@NonNull Exception e) {
                dismissNotification(notificationId);
                changeNumberOfTask(TASK_STOP);
            }
        }
    }
    



    -
    Edité par flo291288 20 février 2018 à 15:37:27

    • Partager sur Facebook
    • Partager sur Twitter

    [Android] Firebase Storage.

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown