Aller au contenu

Lancer un téléchargement dans la barre de notification


Potoman

Recommended Posts

Bonjour tout le monde !

L'application actuelle que je réalise ne peut pas se mettre dans l'android market ou tout autre market online. Je doit donc gérer sa mise à jour.

J'ai fait les service qui convienne pour que l'appli sache qu'une mise à jour existe et elle en informe l'utilisateur.

Là, c'est à l'utilisateur de lancer le téléchargement...

Bref, la dernière étape est laborieuse et l'utilisateur est fénéant ! ;)

Je souhaite donc lancer le téléchargement en fond pendant que l'utilisateur s'amuse sur l'appli. De là, le téléchargement se lance dans la barre de notification, et une fois qu'il est terminé, le téléphone montre la notification et l'utilisateur n'as plus qu'à appuyé sur la notification pour l'installer.

Ca fait une bonne heure que je recherche et je tombe sur des sujets assez différent.

J'ai trouvé ça : http://android-er.blogspot.com/2011/07/set-title-of-download-on-notification.html

Mais il faut l'appli level 8, soit android 2.3.1 minimum.

Moi, j'ai des utilisateurs qui ont la version 1.6, et donc je n'ai pas accès à DownloadManager.

Avez vous des petits lien intéressant ?

Merkiki

Lien vers le commentaire
Partager sur d’autres sites

Bonjour tout le monde !

L'application actuelle que je réalise ne peut pas se mettre dans l'android market ou tout autre market online. Je doit donc gérer sa mise à jour.

J'ai fait les service qui convienne pour que l'appli sache qu'une mise à jour existe et elle en informe l'utilisateur.

Là, c'est à l'utilisateur de lancer le téléchargement...

Bref, la dernière étape est laborieuse et l'utilisateur est fénéant ! ;)

Je souhaite donc lancer le téléchargement en fond pendant que l'utilisateur s'amuse sur l'appli. De là, le téléchargement se lance dans la barre de notification, et une fois qu'il est terminé, le téléphone montre la notification et l'utilisateur n'as plus qu'à appuyé sur la notification pour l'installer.

Ca fait une bonne heure que je recherche et je tombe sur des sujets assez différent.

J'ai trouvé ça : http://android-er.bl...tification.html

Mais il faut l'appli level 8, soit android 2.3.1 minimum.

Moi, j'ai des utilisateurs qui ont la version 1.6, et donc je n'ai pas accès à DownloadManager.

Avez vous des petits lien intéressant ?

Merkiki

Re, après deux bon petit jours de recherche intensive, j'ai réussis à faire un truc plutôt pas mal.

Alors je met mes étapes ici si ça intéresse quelqu'un :

Tout d'abord, ces trois liens : http://developer.and...emoteViews.html

http://developer.and...ifications.html

et enfin : http://developer.and...rogressBar.html

Pour ce qui est du reste, j'ai instancier ma Notification,

J'ai créé une Asyntask en lui envoyant en paramètre l'instance de l'activité qui à envoyé la notification.

Dans cette esynchTask, je télécharge mon fichier et j'actualise la progressBar à l'aide d'une fonction créé.

Au final, ça donne ça :

class Root {
//variable de la classe :
public static final int NOTIFICATION_NEW_VERSION = 1;
private NotificationManager myNotificationManager = null;
private Notification myNotification = null;
private RemoteViews contentView = null;
DownloadMAJ myDownloadMAJ = null;
//Dans une fonction de la classe :

private fonctionX {
myDownloadMAJ = DownloadMAJ.getInstance();
   if (myDownloadMAJ != null) {

	//On prépare la notification...
	String ns = Context.NOTIFICATION_SERVICE;
	myNotificationManager = (NotificationManager) getSystemService(ns);

	int icon = R.drawable.stat_sys_download_anim0;
	CharSequence tickerText = "Hello";
	long when = System.currentTimeMillis();

	myNotification = new Notification(icon, tickerText, when);

	Context context = getApplicationContext();
	CharSequence contentTitle = "My notification";
	CharSequence contentText = "Hello World!";
	//Intent notificationIntent = new Intent(this, Root.class);
	PendingIntent contentIntent = PendingIntent.getActivity(this, 0, null, 0);
	myNotification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

	myNotification.defaults |= Notification.DEFAULT_LIGHTS;
	myNotification.ledARGB = 0xff00ff00;
	myNotification.ledOnMS = 300;
	myNotification.ledOffMS = 1000;
	myNotification.flags |= Notification.FLAG_SHOW_LIGHTS;

	contentView = new RemoteViews(getPackageName(), R.layout.test_progress_bar);
	contentView.setTextViewText(R.id.tv_notification_mise_a_jour, "MAJ Webteam : " + nomNewVersion.substring(nomNewVersion.indexOf("v"), nomNewVersion.indexOf(".apk")).replace("_", "."));

	contentView.setProgressBar(R.id.pb_notification_mise_a_jour, 100, 0, true);
	myNotification.contentView = contentView;

	//On envoie la notification :
	myNotificationManager.notify(NOTIFICATION_NEW_VERSION, myNotification);

	myDownloadMAJ.execute(this);
   }
   else
	L.v("Root", "Et bim ! Le singleton !");
}


public void actualizeNotification(final int pourcentage, final int tailleKo, final int downloadKo) {
 //RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.test_progress_bar);
 //contentView.setTextViewText(R.id.tv_notification_mise_a_jour, "MAJ Webteam : " + nomNewVersion.substring(nomNewVersion.indexOf("v"), nomNewVersion.indexOf(".apk")).replace("_", "."));

 contentView.setProgressBar(R.id.pb_notification_mise_a_jour, 100, pourcentage, false);

 if (tailleKo >= 1000) {
  float newTailleMo = (float)tailleKo / 1000;
  if (downloadKo >= 1000) {
float newDownloadMo = (float)downloadKo / 1000;
contentView.setTextViewText(R.id.tv_notification_mise_a_jour_pourcentage, newDownloadMo + "Mo / " + newTailleMo + "Mo");
  }
  else
contentView.setTextViewText(R.id.tv_notification_mise_a_jour_pourcentage, downloadKo + "ko / " + newTailleMo + "Mo");
 }
 else
  if (downloadKo >= 1000) {
float newDownloadMo = (float)downloadKo / 1000;
contentView.setTextViewText(R.id.tv_notification_mise_a_jour_pourcentage, newDownloadMo + "Mo / " + tailleKo + "Ko");
  }
  else
contentView.setTextViewText(R.id.tv_notification_mise_a_jour_pourcentage, downloadKo + "ko / " + tailleKo + "Ko");
 myNotification.contentView = contentView;

 myNotificationManager.notify(NOTIFICATION_NEW_VERSION, myNotification);
}
}

J'ai fait de ma classe DownloadMAJ un singleton, comme celà, si on quitte l'application et que l'on reviens dedans, on ne duplique pas le téléchargement. CQFD

Et enfin, ma classe DownloadMAJ :

package org.example.webteam;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.apache.http.util.ByteArrayBuffer;
import org.potoman.tools.L;
import android.app.NotificationManager;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Environment;
public class DownloadMAJ extends AsyncTask<Root, Void, String> {
private static boolean isCreate = false;

private DownloadMAJ() {

}

public static DownloadMAJ getInstance() {
 if (isCreate)
  return null;
 else {
  isCreate = true;
  return new DownloadMAJ();
 }
}

@Override
protected String doInBackground(Root... myRoot) {
 // TODO Auto-generated method stub
 L.v("DownloadMAJ", "plop");

 //params[0].getMyNotification();


 //1.2Mb
 try {
  String fileName = Environment.getExternalStorageDirectory() + "/testImage.jpg";
  L.v("DownloadMAJ", fileName);
		URL url = new URL("http://www.wallfizz.com/art-design/paysage-virtuel/1480-paysage-virtuel-WallFizz.jpg"); //you can write here any link
		File file = new File(fileName);
		long startTime = System.currentTimeMillis();
		L.d("ImageManager", "download begining");
		L.d("ImageManager", "download url:" + url);
		L.d("ImageManager", "downloaded file name:" + fileName);
		/* Open a connection to that URL. */
		URLConnection ucon = url.openConnection();
		/*
		 * Define InputStreams to read from the URLConnection.
		 */
		InputStream is = ucon.getInputStream();
		BufferedInputStream bis = new BufferedInputStream(is);
		/*
		 * Read bytes to the Buffer until there is nothing more to read(-1).
		 */
		L.v("DownloadMAJ", "taille : " + ucon.getContentLength());
		ByteArrayBuffer baf = new ByteArrayBuffer(50);
		int count = 0;
		int countTotal = 0;
		int current = 0;
		while ((current = bis.read()) != -1) {
			baf.append((byte) current);
			count++;
			countTotal++;
			if (count == 10000) {
			 L.v("DownloadMAJ", "pourcentage : " + 100 * countTotal / ucon.getContentLength());
			 myRoot[0].actualizeNotification(100 * countTotal / ucon.getContentLength(), (int)(ucon.getContentLength()/1000), countTotal/1000);
			 count = 0;
			}
		}
		myRoot[0].actualizeNotification(100, (int)(ucon.getContentLength()/1000), (int)(ucon.getContentLength()/1000));
		L.v("DownloadMAJ", "taille téléchargé : " + count);
		/* Convert the Bytes read to a String. */
		FileOutputStream fos = new FileOutputStream(file);
		fos.write(baf.toByteArray());
		fos.close();
		L.d("ImageManager", "download ready in"
						+ ((System.currentTimeMillis() - startTime) / 1000)
						+ " sec");
 } catch (IOException e) {
		 L.d("ImageManager", "Error: " + e);
 }


 return null;
}

@Override
protected void onPostExecute(String result) {
 L.d("DownloadMAJ", "finis");
 super.onPostExecute(result);
}

@Override
protected void finalize() throws Throwable {
 isCreate = false;
 super.finalize();
}
}

Et enfin, le petit fichier xml de ma notification personnalisé :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
 <LinearLayout
 android:orientation="horizontal"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content">
 <ImageView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:src="@drawable/stat_sys_download_anim0"
  android:layout_marginTop="5dp"
  android:layout_marginBottom="5dp"
  android:layout_marginLeft="5dp"/>
 <TextView
  android:id="@+id/tv_notification_mise_a_jour"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:textStyle="bold"
  android:layout_margin="5dp"
  android:textColor="#ff000000"
  android:textSize="18dip" />
</LinearLayout>
<LinearLayout
 android:orientation="horizontal"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content">
 <ProgressBar
  android:id="@+id/pb_notification_mise_a_jour"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:layout_weight="1"
  style="@android:style/Widget.ProgressBar.Horizontal"
  android:layout_marginBottom="5dp"
  android:layout_marginRight="5dp"
  android:layout_marginLeft="5dp" />
 <TextView
  android:id="@+id/tv_notification_mise_a_jour_pourcentage"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:layout_weight="1"
  android:layout_marginRight="5dp"
  android:layout_marginBottom="5dp"
  android:textColor="#ff000000"
  android:text="Connexion..."/>
</LinearLayout>
 <!-- -->
</LinearLayout>

Voilà, j'espère que ça aidera des gens !

:)

Lien vers le commentaire
Partager sur d’autres sites

Re !

Voilà, j'ai modifier deux trois ligne, en particulier le fait de lancer un Intent lors de l'appui sur la notification.

J'ai ajouté ça :

Intent promptInstall = new Intent(Intent.ACTION_VIEW);
    promptInstall.setDataAndType(Uri.parse("file:///sdcard/WebteamAndroid_v3_Blandine_2.apk"), "application/vnd.android.package-archive");
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, promptInstall, 0);

Celà me permet d'installer l'application à la fin de son téléchargement.

Le problème, c'est que j'ai un horrible "Application non installée". J'ai vu sur internet que ça pouvait être causé par le fait que l'application est déjà installé. Normal, je souhaite faire une mise à jour.

Comment faire pour forcer sa mise à jour ?

Cordialement

Lien vers le commentaire
Partager sur d’autres sites

Salut !

Le problème, c'est que j'ai un horrible "Application non installée". J'ai vu sur internet que ça pouvait être causé par le fait que l'application est déjà installé. Normal, je souhaite faire une mise à jour.

Comment faire pour forcer sa mise à jour ?

Tu as bien incrémenté la version dans ton manifest ?

PS : Juste par curiosité, pourquoi ne peut-elle pas être sur le market ? :emo_im_lips_are_sealed:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...