2016-10-05 4 views
-1

제 코드에서 이미지가 포함되어 있고 null이 아닌 폴더에서 이미지를 검색하고 있습니다. 그것은 벽지 관리자의 setBitmap 코드를 얻는 몇 가지 이유로 작업을 중단하고 아래의 오류를 출력하는 것 같습니다. 어떤 도움을 주시면 감사하겠습니다. 감사합니다비트 맵이 파일에서 읽는 중입니다.

                    Process: coolwallpaper.alexcz.coolwallpaper, PID: 15613 
                        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.setBitmap(WallpaperManager.java:956) 
                         at coolwallpaper.alexcz.coolwallpaper.Main$1.onClick(Main.java:54) 
                         at android.view.View.performClick(View.java:5197) 
                         at android.view.View$PerformClick.run(View.java:20926) 
                         at android.os.Handler.handleCallback(Handler.java:739) 
                         at android.os.Handler.dispatchMessage(Handler.java:95) 
                         at android.os.Looper.loop(Looper.java:145) 
                         at android.app.ActivityThread.main(ActivityThread.java:5951) 
                         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:1400) 
                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) 

static final File dir = new File("/data/data/coolwallpaper.alexcz.coolwallpaper/app_imageDir/"); 

    Button createWallpaper; 
    Button setWallpaper; 

    Bitmap bitmap; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     createWallpaper = (Button)findViewById(R.id.createWallpaper); 
     setWallpaper = (Button)findViewById(R.id.set_wallpaper); 

     setWallpaper.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       AsyncTask.execute(new Runnable() { 
        @Override 
        public void run() { 
         if (dir.isDirectory()) { // make sure it's a directory 
          for (File f : dir.listFiles()) { 
           bitmap = BitmapFactory.decodeFile(f.getAbsolutePath()); 
           System.out.println(bitmap.getWidth()); 
          } 
         } 
        } 
       }); 

       WallpaperManager myWallpaperManager 
         = WallpaperManager.getInstance(getApplicationContext()); 
       try { 
        myWallpaperManager.setBitmap(bitmap); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

     createWallpaper.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(Main.this, FractalActivity.class); 
       startActivity(intent); 
      } 
     }); 

    } 
+0

'bitmap = BitmapFactory.decodeFile (f.getAbsolutePath()); 왜 그 디렉토리에있는 모든 파일에 대해 그 문장을 실행하겠습니까? 마지막 하나만 살아남을 수 있습니다. – greenapps

답변

0

비동기 작업이 별도의 스레드에서 실행 때문입니다. 바탕 화면을 변경하는 비동기 작업보다 먼저 코드가 실행되면서 비트 맵이 백그라운드에서 파일에서 계속로드되는 동안 실행됩니다. 그렇기 때문에 setBitmap에 null 인수가 포함되어 있다고합니다.

관련 문제