2 votes

Mise à jour programmatique de l'apk (téléchargement et démarrage de l'installation) Android API v26

J'ai lu toutes les solutions à ce problème et je sais qu'il peut être considéré comme dupliqué, mais ce n'est pas le cas. Je vois le message Error : Try Again et je vois le message Update Error.

Je pense que la version 26 d'Android a changé quelque chose à propos de intent.setDataAndType ou je ne sais pas pourquoi cela ne fonctionne pas.

J'obtiens également des autorisations qui ressemblent à ce code

ActivityCompat.requestPermissions(Update.this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                REQUEST_WRITE_STORAGE);

Le problème ne peut être résolu. Je veux juste télécharger et installer le fichier apk.

AndroidManifest.xml (j'ai ajouté l'autorisation d'écriture)

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Update.java

package com.my.testapp;

public class Update extends AppCompatActivity {

ProgressDialog bar;
private static String TAG = "Update";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    new DownloadNewVersion().execute();

}

class DownloadNewVersion extends AsyncTask<String,Integer,Boolean> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        bar = new ProgressDialog(Update.this);
        bar.setCancelable(false);

        bar.setMessage("Downloading...");

        bar.setIndeterminate(true);
        bar.setCanceledOnTouchOutside(false);
        bar.show();

    }

    protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);

        bar.setIndeterminate(false);
        bar.setMax(100);
        bar.setProgress(progress[0]);
        String msg = "";
        if(progress[0]>99){

            msg="Finishing... ";

        }else {

            msg="Downloading... "+progress[0]+"%";
        }
        bar.setMessage(msg);

    }
    @Override
    protected void onPostExecute(Boolean result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);

        bar.dismiss();

        if(result){

            Toast.makeText(getApplicationContext(),"Update Done",
                    Toast.LENGTH_SHORT).show();

        }else{

            Toast.makeText(getApplicationContext(),"Error: Try Again",
                    Toast.LENGTH_SHORT).show();

        }

    }

    @Override
    protected Boolean doInBackground(String... arg0) {
        Boolean flag = false;

        try {

            URL url = new URL("http://mydownloadurl.com/_download/update.apk");

            HttpURLConnection c = (HttpURLConnection) url.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();

            String PATH = Environment.getExternalStorageDirectory()+"/Download/";
            File file = new File(PATH);
            file.mkdirs();

            File outputFile = new File(file,"app-debug.apk");

            if(outputFile.exists()){
                outputFile.delete();
            }

            FileOutputStream fos = new FileOutputStream(outputFile);
            InputStream is = c.getInputStream();

            int total_size = 277962;//size of apk

            byte[] buffer = new byte[1024];
            int len1 = 0;
            int per = 0;
            int downloaded=0;
            while ((len1 = is.read(buffer)) != -1) {
                fos.write(buffer, 0, len1);
                downloaded +=len1;
                per = (int) (downloaded * 100 / total_size);
                publishProgress(per);
            }
            fos.close();
            is.close();

            OpenNewVersion(PATH);

            flag = true;
        } catch (Exception e) {
            Log.e(TAG, "Update Error: " + e.getMessage());
            flag = false;
        }
        return flag;

    }

}

void OpenNewVersion(String location) {

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(Uri.fromFile(new File(location + "app-debug.apk")),
            "application/vnd.android.package-archive");
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);

}

}

0voto

Berkay Yıldız Points 46

Commonsware merci beaucoup, je gaspille mes 2-3 heures à faire des choses différentes.

En fait, j'ai déjà ajouté ce code, mais le problème n'a pas été résolu. J'ai réessayé et ça a marché, c'est peut-être une solution paresseuse mais ça marche.

Cette url contient plus d'informations sur le problème D'autres solutions peuvent être appliquées, mais cela me suffit.

        if(Build.VERSION.SDK_INT>=24){
        try{
            Method m = StrictMode.class.getMethod("disableDeathOnFileUriExposure");
            m.invoke(null);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

Le problème est résolu et je vous remercie encore une fois. L'application a également besoin de cette autorisation de stockage.

ActivityCompat.requestPermissions(Update.this,new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X