document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. import android.content.Context;
  2. import android.content.Intent;
  3. import android.content.pm.*;
  4. import android.net.Uri;
  5. import android.os.AsyncTask;
  6. import android.os.Environment;
  7. import android.util.Log;
  8.  
  9. import org.json.*;
  10.  
  11. import java.io.*;
  12. import java.net.HttpURLConnection;
  13. import java.net.URL;
  14.  
  15. /**
  16.  * Created by Guillermo Marcel on 24/10/2014.
  17.  */
  18. public class Autoupdater{
  19.  
  20.     /**
  21.      * Objeto contexto para ejecutar el instalador.
  22.      * Se puede buscar otra forma mas "limpia".
  23.      */
  24.     Context context;
  25.  
  26.     /**
  27.      * Listener que se llamara despues de ejecutar algun AsyncTask.
  28.      */
  29.     Runnable listener;
  30.  
  31.     /**
  32.      * El enlace al archivo público de información de la versión. Puede ser de
  33.      * Dropbox, un hosting propio o cualquier otro servicio similar.
  34.      */
  35.     private static final String INFO_FILE = "http://www.tuweb.com/Android/version.txt";
  36.  
  37.     /**
  38.      * El código de versión establecido en el AndroidManifest.xml de la versión
  39.      * instalada de la aplicación. Es el valor numérico que usa Android para
  40.      * diferenciar las versiones.
  41.      */
  42.     private int currentVersionCode;
  43.  
  44.     /**
  45.      * El nombre de versión establecido en el AndroidManifest.xml de la versión
  46.      * instalada. Es la cadena de texto que se usa para identificar al versión
  47.      * de cara al usuario.
  48.      */
  49.     private String currentVersionName;
  50.  
  51.     /**
  52.      * El código de versión establecido en el AndroidManifest.xml de la última
  53.      * versión disponible de la aplicación.
  54.      */
  55.     private int latestVersionCode;
  56.  
  57.     /**
  58.      * El nombre de versión establecido en el AndroidManifest.xml de la última
  59.      * versión disponible.
  60.      */
  61.     private String latestVersionName;
  62.  
  63.     /**
  64.      * Enlace de descarga directa de la última versión disponible.
  65.      */
  66.     private String downloadURL;
  67.  
  68.     /**
  69.      * Constructor unico.
  70.      * @param context Contexto sobre el cual se ejecutara el Instalador.
  71.      */
  72.     public Autoupdater(Context context) {
  73.         this.context = context;
  74.     }
  75.  
  76.     /**
  77.      * Método para inicializar el objeto. Se debe llamar antes que a cualquie
  78.      * otro, y en un hilo propio (o un AsyncTask) para no bloquear al interfaz
  79.      * ya que hace uso de Internet.
  80.      *
  81.      *            El contexto de la aplicación, para obtener la información de
  82.      *            la versión actual.
  83.      */
  84.     private void getData() {
  85.         try{
  86.             // Datos locales
  87.             Log.d("AutoUpdater", "GetData");
  88.             PackageInfo pckginfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
  89.             currentVersionCode = pckginfo.versionCode;
  90.             currentVersionName = pckginfo.versionName;
  91.  
  92.             // Datos remotos
  93.             String data = downloadHttp(new URL(INFO_FILE));
  94.             JSONObject json = new JSONObject(data);
  95.             latestVersionCode = json.getInt("versionCode");
  96.             latestVersionName = json.getString("versionName");
  97.             downloadURL = json.getString("downloadURL");
  98.             Log.d("AutoUpdate", "Datos obtenidos con éxito");
  99.         }catch(JSONException e){
  100.             Log.e("AutoUpdate", "Ha habido un error con el JSON", e);
  101.         }catch(PackageManager.NameNotFoundException e){
  102.             Log.e("AutoUpdate", "Ha habido un error con el packete :S", e);
  103.         }catch(IOException e){
  104.             Log.e("AutoUpdate", "Ha habido un error con la descarga", e);
  105.         }
  106.     }
  107.  
  108.     /**
  109.      * Método para comparar la versión actual con la última .
  110.      *
  111.      * @return true si hay una versión más nueva disponible que la actual.
  112.      */
  113.     public boolean isNewVersionAvailable() {
  114.         return getLatestVersionCode() > getCurrentVersionCode();
  115.     }
  116.  
  117.     /**
  118.      * Devuelve el código de versión actual.
  119.      *
  120.      * @return integer con la version actual
  121.      */
  122.     public int getCurrentVersionCode() {
  123.         return currentVersionCode;
  124.     }
  125.  
  126.     /**
  127.      * Devuelve el nombre de versión actual.
  128.      *
  129.      * @return IDEM
  130.      */
  131.     public String getCurrentVersionName() {
  132.         return currentVersionName;
  133.     }
  134.  
  135.     /**
  136.      * Devuelve el código de la última versión disponible.
  137.      *
  138.      * @return IDEM
  139.      */
  140.     public int getLatestVersionCode() {
  141.         return latestVersionCode;
  142.     }
  143.  
  144.     /**
  145.      * Devuelve el nombre de la última versión disponible.
  146.      *
  147.      * @return IDEM
  148.      */
  149.     public String getLatestVersionName() {
  150.         return latestVersionName;
  151.     }
  152.  
  153.     /**
  154.      * Devuelve el enlace de descarga de la última versión disponible
  155.      *
  156.      * @return string con la URL de descarga
  157.      */
  158.     public String getDownloadURL() {
  159.         return downloadURL;
  160.     }
  161.  
  162.     /**
  163.      * Método auxiliar usado por getData() para leer el archivo de información.
  164.      * Encargado de conectarse a la red, descargar el archivo y convertirlo a
  165.      * String.
  166.      *
  167.      * @param url
  168.      *            La URL del archivo que se quiere descargar.
  169.      * @return Cadena de texto con el contenido del archivo
  170.      * @throws IOException
  171.      *             Si hay algún problema en la conexión
  172.      */
  173.     private static String downloadHttp(URL url) throws IOException {
  174.         // Codigo de coneccion, Irrelevante al tema.
  175.         HttpURLConnection c = (HttpURLConnection)url.openConnection();
  176.         c.setRequestMethod("GET");
  177.         c.setReadTimeout(15 * 1000);
  178.         c.setUseCaches(false);
  179.         c.connect();
  180.         BufferedReader reader = new BufferedReader(new InputStreamReader(c.getInputStream()));
  181.         StringBuilder stringBuilder = new StringBuilder();
  182.         String line;
  183.         while((line = reader.readLine()) != null){
  184.             stringBuilder.append(line + "\\n");
  185.         }
  186.         return stringBuilder.toString();
  187.     }
  188.  
  189.     /**
  190.      * Metodo de interface.
  191.      * Primer metodo a usar. Se encarga de, en un hilo separado,
  192.      * conectarse al servidor y obtener la informacion de la ultima version de la aplicacion.
  193.      * @param OnFinishRunnable Listener ejecutable al finalizar.
  194.      *                         Codigo que se ejecutara una vez terminado el proceso.
  195.      */
  196.     public void DownloadData(Runnable OnFinishRunnable){
  197.         //Guarda el listener.
  198.         this.listener = OnFinishRunnable;
  199.         //Ejecuta el AsyncTask para bajar los datos.
  200.         downloaderData.execute();
  201.     }
  202.  
  203.     /**
  204.      * Metodo de Interface.
  205.      * Segundo Metodo a usar.
  206.      * Se encargara, una vez obtenidos los datos de la version mas reciente, y en un hilo separado,
  207.      * de comprobar que haya efectivamente una version mas reciente, descargarla e instalarla.
  208.      * Preparar la aplicacion para ser cerrada y desinstalada despues de este metodo.
  209.      * @param OnFinishRunnable Codigo que se ejecutara tras llamar al instalador.
  210.      *                         Ultimo en ejecutar.
  211.      */
  212.     public void InstallNewVersion(Runnable OnFinishRunnable){
  213.         if(isNewVersionAvailable()){
  214.            if(getDownloadURL() == "") return;
  215.             listener = OnFinishRunnable;
  216.             String params[] = {getDownloadURL()};
  217.             downloadInstaller.execute(params);
  218.  
  219.         }
  220.     }
  221.  
  222.     /**
  223.      * Objeto de AsyncTask encargado de descargar la informacion del servidor
  224.      * y ejecutar el listener.
  225.      */
  226.     private AsyncTask downloaderData = new AsyncTask() {
  227.         @Override
  228.         protected Object doInBackground(Object[] objects) {
  229.             //llama al metodo auxiliar que seteara todas las variables.
  230.             getData();
  231.             return null;
  232.         }
  233.  
  234.         @Override
  235.         protected void onPostExecute(Object o) {
  236.             super.onPostExecute(o);
  237.             //Despues de ejecutar el codigo principal, se ejecuta el listener
  238.             //para hacer saber al hilo principal.
  239.             if(listener != null)listener.run();
  240.             listener = null;
  241.         }
  242.     };
  243.  
  244.     /**
  245.      * Objeto de AsyncTask encargado de descargar e instalar la ultima version de la aplicacion.
  246.      * No es cancelable.
  247.      */
  248.     private AsyncTask<String, Integer, Intent> downloadInstaller = new AsyncTask<String, Integer, Intent>() {
  249.         @Override
  250.         protected Intent doInBackground(String... strings) {
  251.             try {
  252.                 URL url = new URL(strings[0]);
  253.                 HttpURLConnection c = (HttpURLConnection) url.openConnection();
  254.                 c.setRequestMethod("GET");
  255.                 c.setDoOutput(true);
  256.                 c.connect();
  257.  
  258.                 String PATH = Environment.getExternalStorageDirectory() + "/download/";
  259.                 File file = new File(PATH);
  260.                 file.mkdirs();
  261.                 File outputFile = new File(file, "app.apk");
  262.                 FileOutputStream fos = new FileOutputStream(outputFile);
  263.  
  264.                 InputStream is = c.getInputStream();
  265.  
  266.                 byte[] buffer = new byte[1024];
  267.                 int len1 = 0;
  268.                 while ((len1 = is.read(buffer)) != -1) {
  269.                     fos.write(buffer, 0, len1);
  270.                 }
  271.                 fos.close();
  272.                 is.close();//till here, it works fine - .apk is download to my sdcard in download file
  273.  
  274.  
  275.                 Intent intent = new Intent(Intent.ACTION_VIEW);
  276.                 intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/" + "app.apk")), "application/vnd.android.package-archive");
  277.                 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  278.                 context.startActivity(intent);
  279.                 //return intent;
  280.             } catch (IOException e) {
  281.  
  282.                 Log.e("Update error!", e.getMessage());
  283.             }
  284.  
  285.             return null;
  286.         }
  287.  
  288.         @Override
  289.         protected void onPostExecute(Intent intent) {
  290.             super.onPostExecute(intent);
  291.             if(listener != null)listener.run();
  292.             listener = null;
  293.         }
  294.     };
  295.  
  296. }
');