1

Ich habe versucht, eine Hintergrund-App zu machen. Wenn wir auf ein bestimmtes Bild aus der Galerie klicken, öffnet sich eine neue Aktivität wie unten, wo das Bild in voller Größe angezeigt wird und es eine Schaltfläche gibt, um es als Hintergrundbild festzulegen. Ich verwende Glide-Bibliothek, um die Bilder von der URL zu laden. Bitte sagen Sie mir, wie Sie es als Hintergrundbild von der URL einrichten, während die App das Bild in voller Größe lädt, aber jedes Mal abstürzt, wenn ich auf die Schaltfläche klicke. Vielleicht ist es ein Problem mit dem Laden von Ether aus der URL oder mit der Einstellung als Hintergrundbild.Wallpaper app crashing beim Klicken auf Set-Taste

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; 
    } 
    } 
} 

ich die Erlaubnis, in AndroidManifest als

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

Dieser gesetzt haben, ist der Fehler, die ich auf die Taste 'als Hintergrundbild' Taste erhalten: -

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) 

Bitte beachten Sie auch, wenn jemand könnte vorschlagen, wenn es ein Problem mit der Erlaubnis ist, da ich ein Marshmallow-Gerät verwende.

Vielen Dank im Voraus.

+1

Bitte senden Sie das Stacktrace –

+1

Protokolle benötigen Spuren des Fehlers zu erhalten, können u veröffentlichen die Protokolle –

+0

Ja, ich habe das Protokoll der Post hinzufügen. Bitte prüfe. Vielen Dank :) –

Antwort

1

Ich fand, wenn Sie auf die Schaltfläche klicken, Sie eine http-Verbindung in der getBitmapFromURL Methode. Vielleicht haben Sie deshalb eine Ausnahme, weil es nicht erlaubt ist, ein Netzwerk auf dem Haupt-Thread zu betreiben, oder Sie erhalten android.os.NetworkOnMainThreadException.

Versuchen Sie einen neuen Thread verwenden in Ihrem getBitmapFromURL Methode zu setzen.


nach dem Protokoll überprüft haben, ist es wirklich ein NetworkOnMainThreadException.

Sie können das 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(); 
    } 
});