2013-03-18 2 views
1

그래서 사용자가 사진을 찍어 로컬에 저장할 수있는 응용 프로그램이 있습니다. 이미지 이름은 나중에 참조 할 수 있도록 내 SQLite 데이터베이스에 저장됩니다. 지금은 비트 맵 이미지를 이미지 뷰로 설정하는 문제를 추적했습니다. 여기에 내 코드입니다 :Android Dev : ViewBinder를 통해 SQLite 데이터베이스에서 참조되는 ListView에 로컬 이미지 파일 삽입

private void displayListView() { 
    // TODO Auto-generated method stub 

    Cursor cursor = info.getListData(); 
    String[] listViewColumns = new String[] { Database.KEY_BREWNAME, Database.KEY_BREWERY, Database.KEY_RATING, 
      Database.KEY_DATEIMAGENAME, }; 
    int[] dataToListView = new int[] { R.id.tvBrewName, R.id.tvBrewery, R.id.tvRating, R.id.ivThumb, }; 

    dataAdapter = new SimpleCursorAdapter(this, R.layout.entrymain, cursor, listViewColumns, dataToListView, 0); 

    ViewBinder viewBinder = new ViewBinder() { 
     public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
      ImageView image = (ImageView)view; 
      Log.w(TAG, "******************List Image loaded == " + columnIndex + " **********************"); 
      try { 
       FileInputStream fis = openFileInput(cursor.getString(columnIndex)); 
       fis.close(); 
       Log.w(TAG, "******************List Image loaded == fis.close **********************"); 
       image.setImageBitmap(BitmapFactory.decodeStream(fis)); 
       Log.w(TAG, "******************List Image loaded == setimage success **********************"); 

      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return true; 

     }; 
    }; 
    ImageView image = (ImageView)findViewById(R.id.ivThumb); 
    viewBinder.setViewValue(image, cursor, cursor.getColumnIndex("date_image_name")); 
    dataAdapter.setViewBinder(viewBinder); 

    listview.setAdapter(dataAdapter); 

이 코드는 내가 image.setImageBitmap에 문제를 추적 ViewBinder 밖으로 및 log.w 년대를 사용하여 잘 작동 (BitmapFactory.decodeStream (FIS))와 나는 아주 이해가 안 돼요 왜이 코드를 사용했는지에 따라 이미지를 설정하지 않을 것입니다. 왜 설정되지 않는지에 대한 아이디어는 java.io.IOException과 관련이 있다는 것을 알았습니다 : 읽기 실패 : EBADF (잘못된 파일 번호) 그러나 어떻게 해결합니까? 미리 감사드립니다! 당신은 폐쇄 InputStream에서 비트 맵을 디코딩하려고

03-18 10:44:16.281: D/ActivityThread(19380): setTargetHeapUtilization:0.25 
03-18 10:44:16.281: D/ActivityThread(19380): setTargetHeapIdealFree:8388608 
03-18 10:44:16.281: D/ActivityThread(19380): setTargetHeapConcurrentStart:2097152 
03-18 10:44:16.782: I/Adreno200-EGLSUB(19380): <ConfigWindowMatch:2087>: Format RGBA_8888. 
03-18 10:44:16.792: E/(19380): <s3dReadConfigFile:75>: Can't open file for reading 
03-18 10:44:16.792: E/(19380): <s3dReadConfigFile:75>: Can't open file for reading 
03-18 10:44:17.112: D/AbsListView(19380): Get MotionRecognitionManager 
03-18 10:44:17.152: W/Start(19380): ******************List Image loaded == 4 ********************** 
03-18 10:44:17.162: W/Start(19380): ******************List Image loaded == fis.close ********************** 
03-18 10:44:17.162: W/System.err(19380): java.io.IOException: read failed: EBADF (Bad file number) 
03-18 10:44:17.172: W/System.err(19380): at libcore.io.IoBridge.read(IoBridge.java:442) 
03-18 10:44:17.172: W/System.err(19380): at java.io.FileInputStream.read(FileInputStream.java:179) 
03-18 10:44:17.172: W/System.err(19380): at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:168) 
03-18 10:44:17.172: W/System.err(19380): at java.io.BufferedInputStream.read(BufferedInputStream.java:309) 
03-18 10:44:17.172: W/System.err(19380): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
03-18 10:44:17.172: W/System.err(19380): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:619) 
03-18 10:44:17.172: W/System.err(19380): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:691) 
03-18 10:44:17.172: W/System.err(19380): at com.ex.beerlog.Start$1.setViewValue(Start.java:78) 
03-18 10:44:17.172: W/System.err(19380): at com.ex.beerlog.Start.displayListView(Start.java:91) 
03-18 10:44:17.172: W/System.err(19380): at com.ex.beerlog.Start.onCreate(Start.java:56) 
03-18 10:44:17.172: W/System.err(19380): at android.app.Activity.performCreate(Activity.java:5048) 
03-18 10:44:17.172: W/System.err(19380): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
03-18 10:44:17.172: W/System.err(19380): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2052) 
03-18 10:44:17.172: W/System.err(19380): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2113) 
03-18 10:44:17.182: W/System.err(19380): at android.app.ActivityThread.access$700(ActivityThread.java:139) 
03-18 10:44:17.182: W/System.err(19380): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1224) 
03-18 10:44:17.182: W/System.err(19380): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-18 10:44:17.182: W/System.err(19380): at android.os.Looper.loop(Looper.java:137) 
03-18 10:44:17.182: W/System.err(19380): at android.app.ActivityThread.main(ActivityThread.java:4918) 
03-18 10:44:17.182: W/System.err(19380): at java.lang.reflect.Method.invokeNative(Native Method) 
03-18 10:44:17.182: W/System.err(19380): at java.lang.reflect.Method.invoke(Method.java:511) 
03-18 10:44:17.182: W/System.err(19380): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004) 
03-18 10:44:17.182: W/System.err(19380): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771) 
03-18 10:44:17.182: W/System.err(19380): at dalvik.system.NativeStart.main(Native Method) 
03-18 10:44:17.182: W/System.err(19380): Caused by: libcore.io.ErrnoException: read failed: EBADF (Bad file number) 
03-18 10:44:17.182: W/System.err(19380): at libcore.io.Posix.readBytes(Native Method) 
03-18 10:44:17.182: W/System.err(19380): at libcore.io.Posix.read(Posix.java:118) 
03-18 10:44:17.182: W/System.err(19380): at libcore.io.BlockGuardOs.read(BlockGuardOs.java:149) 
03-18 10:44:17.182: W/System.err(19380): at libcore.io.IoBridge.read(IoBridge.java:432) 
03-18 10:44:17.182: W/System.err(19380): ... 23 more 

답변

3

:

여기 내 오류 로그의 세그먼트입니다. fis.close();는 또한 image.setImageBitmap(BitmapFactory.decodeStream(fis));

후 호출해야합니다, 당신은 당신이 정말로 ImageView에 값을 설정하는 경우 setViewValue 방법으로 확인해야 :

ViewBinder viewBinder = new ViewBinder() { 
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
     if (!(view instanceof ImageView) || view.getId() != R.id.ivThumb) { 
      return false; 
     } 

     // the rest of the code 
    }; 
}; 

그리고 마지막 일을. 을 명시 적으로 호출 할 필요가 없으므로 SimpleAdapter이 대신 처리합니다. 이 줄을 제거하면 모든 것이 잘 작동합니다.

+0

+1 InputStream을 닫을 필요가없는 첫 번째 .. –

+0

그게 내가 마침내 내가 뭘 잘못하고 있었는지 물어 보았고, 다른 사람들과 나의 FileInputStream을 닫는 것과 같은 것이었다. 대단히 고마워요.이게 정말 나를 미치게 만들었어요! –

+0

마지막 것 당신이 저를 응답하게 꺼리지 않는 경우에. 'if (if (view instanceof ImageView) || view.getId()! = R.id.ivThumb)'as "문자열보기가 instanceof Imageview가 아니거나 뷰 문자열의 ID가 아닌 경우 r.is.ivThumb then then .... "|| 의미 또는 자바 올바른가요? –