1

J'ai essayé de faire une application de fond d'écran. Lorsque nous cliquons sur une image spécifique de la galerie, elle ouvre une nouvelle activité comme ci-dessous, où l'image est affichée en taille réelle et il y a un bouton pour la définir comme fond d'écran. J'utilise la bibliothèque Glide pour charger les images de l'URL. S'il vous plaît dites-moi comment le définir comme le fond d'écran de l'URL que l'application thee charge l'image en taille réelle, mais se bloque chaque fois que je clique sur le bouton. Peut-être que c'est un problème avec le chargement de l'éther de l'url ou avec le réglage comme fond d'écran.Application de fond d'écran s'écraser sur cliquant sur le bouton set

import android.app.WallpaperManager; 
import android.content.Context; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.Toast; 

import com.bumptech.glide.Glide; 

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

public class Main2Activity extends AppCompatActivity { 
    ImageView img; 
private Bitmap theBitmap; 
Button b; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    final Context c= getApplicationContext(); 
    setContentView(R.layout.activity_main2); 
    b= (Button) findViewById(R.id.button); 
    Intent i=getIntent(); 
    final String url=i.getStringExtra("picture"); 

    img= (ImageView) findViewById(R.id.imageView4); 
    Glide.with(this).load(url).fitCenter() .into(img); 
    b.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      theBitmap=getBitmapFromURL(url); 
      WallpaperManager wallpaperManager = WallpaperManager.getInstance(getBaseContext()); 
      try { 
       wallpaperManager.setBitmap(theBitmap); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 


} 
public static Bitmap getBitmapFromURL(String src) { 
    try { 
     URL url = new URL(src); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoInput(true); 
     connection.connect(); 
     InputStream input = connection.getInputStream(); 
     Bitmap myBitmap = BitmapFactory.decodeStream(input); 
     return myBitmap; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
    } 
} 

J'ai mis la permission AndroidManifest comme

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

C'est l'erreur que je reçois sur appuyant sur la touche 'set comme fond d'écran': -

07-20 09:33:43.127 3024-3024/com.android.backgroundchooser E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: com.android.backgroundchooser, PID: 3024 
                     android.os.NetworkOnMainThreadException 
                      at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273) 
                      at com.android.org.conscrypt.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:755) 
                      at com.android.okhttp.okio.Okio$1.write(Okio.java:76) 
                      at com.android.okhttp.okio.AsyncTimeout$1.write(AsyncTimeout.java:155) 
                      at com.android.okhttp.okio.RealBufferedSink.flush(RealBufferedSink.java:221) 
                      at com.android.okhttp.internal.http.HttpConnection.flush(HttpConnection.java:141) 
                      at com.android.okhttp.internal.http.HttpTransport.finishRequest(HttpTransport.java:52) 
                      at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:902) 
                      at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:788) 
                      at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:443) 
                      at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:388) 
                      at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:231) 
                      at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210) 
                      at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java) 
                      at com.android.backgroundchooser.Main2Activity.getBitmapFromURL(Main2Activity.java:60) 
                      at com.android.backgroundchooser.Main2Activity$1.onClick(Main2Activity.java:42) 
                      at android.view.View.performClick(View.java:5204) 
                      at android.view.View$PerformClick.run(View.java:21156) 
                      at android.os.Handler.handleCallback(Handler.java:739) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5466) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

S'il vous plaît aussi si Quelqu'un pourrait suggérer si c'est un problème avec la permission que j'utilise un dispositif de guimauve.

Merci beaucoup, à l'avance.

+1

s'il vous plaît poster le stacktrace –

+1

besoin des journaux pour obtenir des traces de l'erreur, u peut afficher les journaux –

+0

Oui, j'ai ajouté le journal au poste. Vérifiez s'il vous plaît. Merci :) –

Répondre

1

J'ai trouvé lorsque vous cliquez sur le bouton, vous faites une connexion http dans la méthode getBitmapFromURL. C'est peut-être pourquoi vous avez une exception car il n'est pas autorisé à faire un réseau sur le thread principal ou vous obtiendrez android.os.NetworkOnMainThreadException.

Essayez d'utiliser un nouveau thread pour mettre votre méthode getBitmapFromURL dans.


Après avoir vérifié votre journal, il est vraiment un NetworkOnMainThreadException.

Vous pouvez définir le OnClickListener:

b.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       final Bitmap theBitmap=getBitmapFromURL(url); 
       b.post(new Runnable(){ 
        @Override 
        public void run() { 
         // I'm not sure whether these code work out the main thread, so I use a View.post 
         try { 
          WallpaperManager wallpaperManager = WallpaperManager.getInstance(getBaseContext()); 
          wallpaperManager.setBitmap(theBitmap); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 
       }); 
      } 
     }).start(); 
    } 
});