2016-12-06 52 views
1

我有从字符串格式的图像库中挑选的壁纸的路径。 现在从这个路径,我想从图库或本地存储获取图像可绘制或位图并将其设置为壁纸。从本地设备的路径,获取图像设置为壁纸

我做了什么是:

if (!wallpaperPath.equals("") && wallpaperPath.length() > 0) { 
        Bitmap b = BitmapFactory.decodeFile(wallpaperPath); 
        WallpaperManager wallpaperManager = (WallpaperManager.getInstance(ScrollingActivity.this)); 
        try { 
         wallpaperManager.setBitmap(b); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 

但是这给了我错误

java.lang.RuntimeException: Error receiving broadcast Intent { act=WIFICHANGE flg=0x10 (has extras) } in [email protected] 
                      at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:874) 
                      at android.os.Handler.handleCallback(Handler.java:739) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:135) 
                      at android.app.ActivityThread.main(ActivityThread.java:5253) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:695) 
                     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream)' on a null object reference 
                      at android.app.WallpaperManager.setWallpaper(WallpaperManager.java:1524) 
                      at android.app.WallpaperManager.setBitmap(WallpaperManager.java:1278) 
                      at android.app.WallpaperManager.setBitmap(WallpaperManager.java:1207) 
                      at delusions.com.myapplication.ScrollingActivity$2.onReceive(ScrollingActivity.java:132) 
                      at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:864) 
                      at android.os.Handler.handleCallback(Handler.java:739)  
                      at android.os.Handler.dispatchMessage(Handler.java:95)  
                      at android.os.Looper.loop(Looper.java:135)  
                      at android.app.ActivityThread.main(ActivityThread.java:5253)  
                      at java.lang.reflect.Method.invoke(Native Method)  
                      at java.lang.reflect.Method.invoke(Method.java:372)  
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900)  
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:695)  
       } 

什么应该做的正确方法?

代码来获取壁纸:

case R.id.btn_wallpaper: 
      Intent imageIntent = new Intent(Intent.ACTION_GET_CONTENT); 
      imageIntent.setType("image/*"); 
      Intent chooser = Intent.createChooser(imageIntent,"Select New Wallpaper"); 
      startActivityForResult(chooser,RESULT_WALLPAPER); 
      break;  

和onActivityResult()

if(data!=null) { 
       Bundle bundle = data.getExtras(); 
       System.out.println(" bundle string : "+ bundle.getString("data")); 
       System.out.println(" check here :"+ data.getExtras()!=null?"OK":"NOTOK"); 
       System.out.println(" check here key 2:"+ data.getExtras().containsKey("dat")!=null?"OK":"NOTOK"); 
       Bitmap imagedata = (Bitmap) data.getExtras().get("dat"); 
       ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
       if(imagedata!=null) 
        imagedata.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
       byte[] imageBytes = baos.toByteArray(); 

       String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT); 
       tv_Ringtone.setText(encodedImage); 
       Prefs.writeString(this,Defines.IMAGE_DATA,encodedImage); 

       Uri wallpaperURI = data.getData(); 
       String wallpaperPath = wallpaperURI.getPath(); 
       System.out.println("Wallpaper path encoded: "+ wallpaperURI.getEncodedPath()); 
       System.out.println("Wallpaper path : " + wallpaperPath); 
       Prefs.writeString(this, Defines.WALLPAPER_PATH, wallpaperPath); 
       iv_newWallpaper.setImageURI(wallpaperURI); 
      } 
+0

添加完整的代码为这项活动/片段 –

+0

所选壁纸的路径是/文档/图片:9418 – beginner

+0

请为选择的图像添加代码,并设置在你试过的imageview中选中的图像 –

回答

0

我找到了答案,我的问题,从计算器只,但我错过了我在哪里的链接。

if(data!=null) { 
       Bundle bundle = data.getExtras(); 
       final Uri wallpaperURI = data.getData(); 

        new Thread(new Runnable() { 
         @Override 
         public void run() { 
          Bitmap imagedata = null;//(Bitmap) data.getExtras().get("dat"); 
          try { 
           imagedata = MediaStore.Images.Media.getBitmap(getContentResolver(), wallpaperURI); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
          ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
          if(imagedata!=null) 
           imagedata.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
          byte[] imageBytes = baos.toByteArray(); 

          String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT); 

          Prefs.writeString(ScrollingActivity.this,Defines.IMAGE_DATA, encodedImage); 
          //tv_Ringtone.setText(encodedImage); 

         } 
        }).start(); 
       String wallpaperPath = wallpaperURI.getPath(); 
       System.out.println("Wallpaper path encoded: "+ wallpaperURI.getEncodedPath()); 
       System.out.println("Wallpaper path : " + wallpaperPath); 
       Prefs.writeString(this, Defines.WALLPAPER_PATH, wallpaperPath); 
       iv_newWallpaper.setImageURI(wallpaperURI); 

而且用于设置壁纸

String previouslyEncodedImage = Prefs.readString(ScrollingActivity.this,Defines.IMAGE_DATA); 

       if(!previouslyEncodedImage.equalsIgnoreCase("")){ 
        byte[] b = Base64.decode(previouslyEncodedImage, Base64.DEFAULT); 
        Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length); 
        WallpaperManager wallpaperManager = (WallpaperManager.getInstance(ScrollingActivity.this)); 
        try { 
         wallpaperManager.setBitmap(bitmap); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       }