2015-10-16 354 views
1

我想創建一個應用程序,允許用戶通過單擊按鈕將圖像設置爲壁紙。這個圖像將位於一個url中,並且壁紙的設置通過AsyncTask來執行。我已按照此視頻中顯示的步驟操作:https://www.youtube.com/watch?v=JeA8Z8dtD10但它對我無效。該應用程序顯示按鈕,但是當我點擊它時會發生任何事情。將圖像設置爲來自url的壁紙

下面是代碼:

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

編輯:

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

我還添加INTERNET和SET_WALLPAPER權限清單。你知道錯誤在哪裏嗎?非常感謝你:)

+0

new SetWallpaperTask();或新的SetWallpaperTask()。execute() – Siv

回答

7

而不是試圖自己下載圖像,然後必須處理它。而應使用像畢加索這樣的圖像加載庫。隨着畢加索,你需要把你的點擊聆聽者是:

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

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

好,很容易,而不必處理線程。

+0

謝謝。這是很好的加載圖像並顯示在佈局,但如何將其設置爲壁紙?編輯答案 –

+0

,完全誤讀你的要求。 – FriendlyMikhail

+0

感謝您的回覆。我將代碼放在doInBackground中,因爲我想通過AsyncTask來完成。但我什麼也沒做。我編輯了我的答案。謝謝。 –