2012-08-13 97 views
2

请向我展示如何使用Android WallpaperManager将图像设置为壁纸的示例代码。我缩短了编辑我的问题。希望你们能理解我的问题。我会展示一些我已经做出的尝试。Android设置图像作为壁纸

HomeActivity.class

public class HomeActivity extends BaseActivity { 

    String[] imageUrls; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.ac_home); 
     ArrayList<String> url = new ArrayList<String>(); 
     try { 
      URL url_link = new URL("http://mywebsite.net/web/thumb.xml"); 
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder db = dbf.newDocumentBuilder(); 
      Document doc = db.parse(new InputSource(url_link.openStream())); 
      doc.getDocumentElement().normalize(); 
      NodeList nodeList = doc.getElementsByTagName("list"); 

      for (int i = 0; i < nodeList.getLength(); i++) { 
       Node node = nodeList.item(i); 

       Element fstElmnt = (Element)node; 
       NodeList nameList = fstElmnt.getElementsByTagName("thumb_url"); 
       Element nameElement = (Element)nameList.item(0); 
       nameList = nameElement.getChildNodes(); 

       url.add(nameList.item(0).getNodeValue()); 
      } 
      imageUrls = (String[]) url.toArray(new String[0]); 
     } catch (Exception e) { 
      System.out.println("XML Pasing Excpetion = " + e); 
     } 

    } 
    public void onImageGridClick(View view) { 
     Intent intent = new Intent(this, ImageGridActivity.class); 
     intent.putExtra(Extra.IMAGES, imageUrls); 
     startActivity(intent); 
    } 

    public void onImagePagerClick(View view) { 
     Intent intent = new Intent(this, ImagePagerActivity.class); 
     intent.putExtra(Extra.IMAGES, imageUrls); 
     startActivity(intent); 
    } 
} 

ImagePagerActivity.class

package com.nostra13.example.universalimageloader; 


import java.io.IOException; 


import android.app.WallpaperManager; 
import android.graphics.Bitmap; 
import android.os.Bundle; 
import android.os.Parcelable; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.animation.Animation; 
import android.view.animation.AnimationUtils; 
import android.widget.ImageView; 
import android.widget.ProgressBar; 
import android.widget.Toast; 

import com.nostra13.universalimageloader.core.DisplayImageOptions; 
import com.nostra13.universalimageloader.core.assist.FailReason; 
import com.nostra13.universalimageloader.core.assist.ImageLoadingListener; 
import com.nostra13.universalimageloader.core.assist.ImageScaleType; 


public class ImagePagerActivity extends BaseActivity { 

    private ViewPager pager; 

    private DisplayImageOptions options; 



    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.ac_image_pager); 
     Bundle bundle = getIntent().getExtras(); 
     String[] imageUrls = bundle.getStringArray(Extra.IMAGES); 
     int pagerPosition = bundle.getInt(Extra.IMAGE_POSITION, 0); 

     options = new DisplayImageOptions.Builder() 
      .showImageForEmptyUri(R.drawable.image_for_empty_url) 
      .cacheOnDisc() 
      .imageScaleType(ImageScaleType.EXACT) 
      .build(); 

     pager = (ViewPager) findViewById(R.id.pager); 
     pager.setAdapter(new ImagePagerAdapter(imageUrls)); 
     pager.setCurrentItem(pagerPosition); 
    } 

    public void setWallpaper() { 

     WallpaperManager myWallpaperManager 
     = WallpaperManager.getInstance(getApplicationContext()); 
     try { 
     myWallpaperManager.setResource(R.id.pager); // nothing happened 
     } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main_menu, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.item_clear_memory_cache: 
       imageLoader.clearMemoryCache(); 
       return true; 
      case R.id.item_clear_disc_cache: 
       setWallpaper(); 
       return true; 
      default: 
       return false; 
     } 
    } 


    @Override 
    protected void onStop() { 
     imageLoader.stop(); 
     super.onStop(); 
    } 

    private class ImagePagerAdapter extends PagerAdapter { 

     private String[] images; 
     private LayoutInflater inflater; 

     ImagePagerAdapter(String[] images) { 
      this.images = images; 
      inflater = getLayoutInflater(); 
     } 

     @Override 
     public void destroyItem(View container, int position, Object object) { 
      ((ViewPager) container).removeView((View) object); 
     } 

     @Override 
     public void finishUpdate(View container) { 
     } 

     @Override 
     public int getCount() { 
      return images.length; 
     } 

     @Override 
     public Object instantiateItem(View view, int position) { 
      final View imageLayout = inflater.inflate(R.layout.item_pager_image, null); 
      final ImageView imageView = (ImageView) imageLayout.findViewById(R.id.image); 
      final ProgressBar spinner = (ProgressBar) imageLayout.findViewById(R.id.loading); 

      imageLoader.displayImage(images[position], imageView, options, new ImageLoadingListener() { 
       public void onLoadingStarted() { 
        spinner.setVisibility(View.VISIBLE); 
       } 

       public void onLoadingFailed(FailReason failReason) { 
        String message = null; 
        switch (failReason) { 
         case IO_ERROR: 
          message = "Input/Output error"; 
          break; 
         case OUT_OF_MEMORY: 
          message = "Out Of Memory error"; 
          break; 
         case UNKNOWN: 
          message = "Unknown error"; 
          break; 
        } 
        Toast.makeText(ImagePagerActivity.this, message, Toast.LENGTH_SHORT).show(); 

        spinner.setVisibility(View.GONE); 
        imageView.setImageResource(android.R.drawable.ic_delete); 
       } 

       public void onLoadingComplete(Bitmap loadedImage) { 
        spinner.setVisibility(View.GONE); 
        Animation anim = AnimationUtils.loadAnimation(ImagePagerActivity.this, R.anim.fade_in); 
        imageView.setAnimation(anim); 
        anim.start(); 
       } 

       public void onLoadingCancelled() { 
        // Do nothing 
       } 
      }); 

      ((ViewPager) view).addView(imageLayout, 0); 
      return imageLayout; 
     } 

     @Override 
     public boolean isViewFromObject(View view, Object object) { 
      return view.equals(object); 
     } 

     @Override 
     public void restoreState(Parcelable state, ClassLoader loader) { 
     } 

     @Override 
     public Parcelable saveState() { 
      return null; 
     } 

     @Override 
     public void startUpdate(View container) { 
     } 
    } 

} 

1日尝试(我pagerPosition是给错误 “pagerPosition不能被解析为一个变量”)

public void setWallpaper(){ 
      Bitmap bitmap = BitmapFactory.decodeResource(getResources(), pagerPosition); 
    try { 
     ImagePagerActivity.this.setWallpaper(bitmap); 
      } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 
     Log.d("Gallery Example", "Image setted."); 
      } 

第二尝试(我的页面位置给出错误“页面位置不能重新解决变量“)

public void setWallpaper() { 

     try { 
      File file = new File("/sdcard/sampleimage"); 
      Bitmap bitmap = BitmapFactory.decodeResource(getResources(), pagerPosition); 
      bitmap.compress(CompressFormat.JPEG, 80, new FileOutputStream(file)); 
      Context context = this.getBaseContext(); 
      context.setWallpaper(bitmap);    
      Toast.makeText(getApplicationContext(), "Wallpaper has been set", Toast.LENGTH_SHORT).show();    
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     }   
    } 

@Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      switch (item.getItemId()) { 
       case R.id.set_wallpaper: 
        setWallpaper(); 
        return true; 
       default: 
        return false; 
      } 
     } 

第3次尝试(我的setResource(R.id.pager)没有从viewpager获取图像。

public void setWallpaper() { 

     WallpaperManager myWallpaperManager 
     = WallpaperManager.getInstance(getApplicationContext()); 
     try { 
     myWallpaperManager.setResource(R.id.pager); 
     } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 

} 

结论

,如果我把我的onCreate我的整个项目将无法运行上面的下方代码。

 Bundle bundle = getIntent().getExtras(); 
     String[] imageUrls = bundle.getStringArray(Extra.IMAGES); 
     final int pagerPosition = bundle.getInt(Extra.IMAGE_POSITION, 0); 
+0

任何人都可以帮助我吗? – 2012-08-14 07:21:06

+0

你可以发布整个代码吗? – rajpara 2012-08-14 14:38:21

回答

6

在ImagePagerActivity中尝试下面的代码,我在代码下面测试,它正在工作。

// fetch bitmap from view 
public static Bitmap getBitmapFromView(View view) { 
    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view 
      .getHeight(), Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(returnedBitmap); 
    Drawable bgDrawable = view.getBackground(); 
    if (bgDrawable != null) 
     bgDrawable.draw(canvas); 
    else 
     // if we unable to get background drawable then we will set white color as wallpaper 
     canvas.drawColor(Color.WHITE); 
    view.draw(canvas); 
    return returnedBitmap; 
} 

public void setWall(int i) { 
    WallpaperManager myWallpaperManager = WallpaperManager.getInstance(getApplicationContext()); 
    try { 
     // below line of code will set your current visible pager item to wallpaper 
     // first we have to fetch bitmap from visible view and then we can pass it to wallpaper 
     myWallpaperManager.setBitmap(getBitmapFromView(pager.getChildAt(1))); 

     // below line of code will set input stream data directly to wallpaper 
     // myWallpaperManager.setStream(InputStream Data); 

     // below line of code will set any image which is in the drawable folder 
     // myWallpaperManager.setResource(R.drawable.icon); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

它将设置当前可见寻呼机的项目视图(如果它是进度轮或图像)。

+0

谢谢。它的工作现在..非常感谢Android编码器 – 2012-08-17 00:49:03

+0

@rajpara我没有为我工作。你能解释一下你在setWall(int i)中传递了什么?谢谢 – Joolah 2014-12-11 03:05:05

+0

@rajpara,我已经问了一个类似的问题[这里](http://stackoverflow.com/questions/27414798/set-image-wallaper-of-viewpager-in-universal-image-loader-uil),可以给我一只手请,谢谢 – Joolah 2014-12-11 03:19:08

0

这可能会帮助你和你的setBackground方法...

String imagePath = ""; // YOUR PATH HERE 
FileInputStream is = new FileInputStream(new File(imagePath)); 
BufferedInputStream bis = new BufferedInputStream(is); 
Bitmap b = BitmapFactory.decodeStream(bis); 
Bitmap bitmapToUse = Bitmap.createScaledBitmap(b, parent.getWidth(), parent.getHeight(), true); 
b.recycle(); 

if(!("").equals(imagePath)){ 
    WallpaperManager wallpaperManager = WallpaperManager.getInstance(this); 
    Drawable wallpaperDrawable = wallpaperManager.getDrawable(); 
    wallpaperManager.setBitmap(bitmapToUse); 
} 

这应该设置你的文件到您的墙纸没有问题。

你能更具体地说明你需要什么“saveImage()”吗?你想从哪里拯救?它是本地存储吗?或者一个网站?请详细说明。

[编辑] 为清楚起见已更新代码

[编辑2] 若要从URL保存图像...

File imageFile = new File("image.png"); // This is location AND file name, all i put here was the filename 
URL url = new URL("http://www.whatever.com/image.png"); 

        Bitmap bmp = BitmapFactory.decodeStream(url.openConnection() 
          .getInputStream()); 

        FileOutputStream out = new FileOutputStream(imageFile); 
        bmp.compress(Bitmap.CompressFormat.PNG, 100, out); 

[编辑3]

的 '父' 是或者你的父视图(通常是当前活动的视图)。还有其他方法可以设置,parent.width/height是你如何定义壁纸图像需要多大的方式。

+0

我已经提出了你建议的代码,我的图像路径是imageUrls。如何将其设置为我的代码?而且我在parent.getWidth(),parent.getHeight()方面有错误。 “父母无法解决”。我想将这些图像下载到我的本地SD中。请引导我对这个瑞恩。谢谢。 – 2012-08-13 17:18:03

+0

查看更新的答案。 – RyanInBinary 2012-08-13 17:19:27

+0

亲爱的瑞恩,谢谢你的回答。你能告诉我如何链接我的Imagepath到setbackground()? – 2012-08-13 17:35:20