2015-10-16 1 views
1

Je veux créer une application qui permet à l'utilisateur de définir une image comme fond d'écran en cliquant sur un bouton. Cette image serait située dans une URL, et le réglage du papier peint est effectué via AsyncTask. J'ai suivi les étapes comme indiqué dans cette vidéo: https://www.youtube.com/watch?v=JeA8Z8dtD10 mais cela ne fonctionne pas pour moi. L'application affiche le bouton, mais quand je clique dessus, il se passe quelque chose.Définir l'image comme fond d'écran de l'URL

Voici le code:

package com.example.myapplication4; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.app.WallpaperManager; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 
import java.net.URLConnection; 

import javax.net.ssl.HttpsURLConnection; 

public class MainActivity extends Activity { 

public ProgressDialog progressDialog; 

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

    Button btnSetWallpaper = (Button) findViewById(R.id.button); 

    btnSetWallpaper.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String urlImage ="https://www.geektopia.es/storage/geek/posts/2015/08/17/marshmallow.jpg"; 
      new SetWallpaperTask().equals(urlImage); 

     } 
    }); 
} 

public InputStream OpenHttpConnection (String urlString) 
throws IOException 
{ 
    InputStream in = null; 
    int response = -1; 
    URL url = new URL (urlString); 
    URLConnection conn = url.openConnection(); 

    if (!(conn instanceof HttpsURLConnection)) { 
     throw new IOException("Not an HTTP connection"); 
    } 

    try { 
     HttpsURLConnection httpCon = (HttpsURLConnection)conn; 
     httpCon.setInstanceFollowRedirects(true); 
     httpCon.setRequestMethod("Get"); 
     httpCon.connect(); 
     response = httpCon.getResponseCode(); 
     if (response == HttpsURLConnection.HTTP_OK) { 
      in = httpCon.getInputStream(); 
     } 
    }catch (Exception ex) { 
     throw new IOException("Error connecting..."); 
    } 
    return in; 
} 

public Bitmap DecodeStream (String url) { 
    Bitmap bitmap = null; 
    InputStream in = null; 
    try { 
     in = OpenHttpConnection(url); 
     bitmap = BitmapFactory.decodeStream(in); 
     in.close(); 
    } 
    catch (IOException e) { 
     Toast.makeText(this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); 
    } 
    return bitmap; 
} 

public class SetWallpaperTask extends AsyncTask <String, Void, Bitmap> { 

    @Override 
    protected Bitmap doInBackground(String... params) { 

     Bitmap bitmap = DecodeStream(params[0]); 
     return bitmap; 
    } 

    @Override 
    protected void onPostExecute (Bitmap result) { 
     super.onPostExecute(result); 

     WallpaperManager wallpaperManager = WallpaperManager.getInstance(getBaseContext()); 
     try { 
      wallpaperManager.setBitmap(result); 
      progressDialog.dismiss(); 
      Toast.makeText(getApplicationContext(), "Set wallpaper successfully", Toast.LENGTH_SHORT).show(); 


     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

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

     progressDialog = new ProgressDialog(MainActivity.this); 
     progressDialog.setMessage("Please wait..."); 
     progressDialog.setCancelable(false); 
     progressDialog.show(); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    return super.onCreateOptionsMenu(menu); 
} 
} 

EDIT:

public class MainActivity extends Activity { 

public ProgressDialog progressDialog; 

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

    Button btnSetWallpaper = (Button) findViewById(R.id.button); 

    btnSetWallpaper.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      new SetWallpaperTask(); 
     } 
    }); 
} 

public class SetWallpaperTask extends AsyncTask <String, Void, Bitmap> { 

    @Override 
    protected Bitmap doInBackground(String... params) { 
     Bitmap result= null; 
     try { 
      result = Picasso.with(getApplicationContext()) 
        .load("https://www.geektopia.es/storage/geek/posts/2015/08/17/marshmallow.jpg") 
        .get(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     WallpaperManager wallpaperManager = WallpaperManager.getInstance(getApplicationContext()); 
     try { 
      wallpaperManager.setBitmap(result); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
     return result; 
    } 

    @Override 
    protected void onPostExecute (Bitmap result) { 
     super.onPostExecute(result); 

     WallpaperManager wallpaperManager = WallpaperManager.getInstance(getBaseContext()); 
     try { 
      wallpaperManager.setBitmap(result); 
      progressDialog.dismiss(); 
      Toast.makeText(getApplicationContext(), "Set wallpaper successfully", Toast.LENGTH_SHORT).show(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

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

     progressDialog = new ProgressDialog(MainActivity.this); 
     progressDialog.setMessage("Please wait..."); 
     progressDialog.setCancelable(false); 
     progressDialog.show(); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    return super.onCreateOptionsMenu(menu); 
} 
} 

J'ai également ajouté des autorisations INTERNET et SET_WALLPAPER au Manifest. Savez-vous où est l'erreur? Merci beaucoup :)

+0

new SetWallpaperTask(); ou nouveau SetWallpaperTask(). execute() – Siv

Répondre

7

Plutôt que d'essayer de télécharger l'image vous-même et de devoir ensuite la traiter. Au lieu de cela, utilisez une bibliothèque de chargement d'images comme Picasso. Avec Picasso tout ce que vous devez mettre dans votre écoute de clic est:

Bitmap result=Picasso.with(context) 
      .load(imageURL) 
      .get(); 

WallpaperManager wallpaperManager = WallpaperManager.getInstance(context); 
     try { 
      wallpaperManager.setBitmap(result); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 

Nice et facile sans avoir à faire avec le filetage.

+0

Merci. C'est bien de charger l'image et de l'afficher dans la mise en page, mais comment la définir comme fond d'écran? –

+0

réponse éditée, complètement mal interprété votre exigence. – FriendlyMikhail

+0

Merci pour votre réponse. J'ai placé le code dans doInBackground comme je voudrais le faire via AsyncTask. Mais je ne fais rien. J'ai édité ma réponse. Je vous remercie. –