2013-05-18 35 views
0

我想獲取特定文件夾中存在的文件列表。但listfiles在第一次從相機捕捉圖像時返回大小0。但是如果我從相機拍攝下一張照片,尺寸顯示爲1。我檢查了特定的文件夾,圖像存在。如果我回到以前的活動並返回到相機活動,它顯示正確的大小。這裏是我的代碼:ListFiles第一次沒有正確獲取文件夾文件

CameraTestActivity.java:

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

setContentView(R.layout.main); 


bitmapImageView = new ArrayList<ImageToLoad>(); 

((FrameLayout) findViewById(R.id.mPreview)).addView(mPreview); 

ExternalStorageDirectoryPath = Environment 
     .getExternalStorageDirectory().getAbsolutePath(); 

targetPath = ExternalStorageDirectoryPath + "/images/"; 
targetDirector = new File(targetPath); 

scroller = (HorizontalImageScroller) findViewById(R.id.scroller_images); 
adapter = new HorizontalImageScrollerAdapter(CameraTestActivity.this, bitmapImageView); 
adapter.setImageSize((int) getResources().getDimension(R.dimen.image_size)); 



scroller.setAdapter(adapter); 

this.scroller.setOnItemClickListener(this); 
_horizontalImageScrollers = new ArrayList<HorizontalImageScroller>(); 
_horizontalImageScrollers.add(scroller); 

((ImageButton)findViewById(R.id.cancel_camera)).setOnClickListener(onButtonClick); 
((ImageButton)findViewById(R.id.hide)).setOnClickListener(onButtonClick); 

LoadImagefromSD(); 

mTakePicture = (ImageButton) findViewById(R.id.takepicture); 
mTakePicture.setOnClickListener(mTakePictureAction); 

}

onClickEvent相機:

/// Handles when mTakePicture is clicked 
    private OnClickListener mTakePictureAction = new OnClickListener() 
    { 
    @Override 
    public void onClick(View v) 
    { 
     if (mCamera != null) 
     { 
     new LongOperation().execute(""); 
    } 

} 

};

的AsyncTask:

private class LongOperation extends AsyncTask<String, Void, String> { 

     @Override 
    protected String doInBackground(String... params) 
    { 
     mCamera.takePicture(); 
     return "Executed"; 
    }  

    @Override 
    protected void onPostExecute(String result) 
    { 
     pDialog.dismiss(); 
     LoadImagefromSD(); 

    } 

    @Override 
    protected void onPreExecute() 
    { 
     pDialog = new ProgressDialog(CameraTestActivity.this); 
     pDialog.setMessage("Loading..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) 
    { 

    } 

}

LoadImagefromSdCard():

private void LoadImagefromSD() 
    { 
     if (targetDirector.exists()) 
     { 

     bitmapImageView.clear(); 
     File[] files = targetDirector.listFiles(); 
     Toast.makeText(getApplicationContext(), String.valueOf("list files "+targetDirector.listFiles().length), Toast.LENGTH_LONG).show(); 
     Toast.makeText(getApplicationContext(), String.valueOf("files length"+files.length), Toast.LENGTH_LONG).show(); 
     for (File file : files) 
     { 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inSampleSize = 8; 

      Bitmap bmp = BitmapFactory.decodeFile(file.getAbsolutePath(), options); 
      Drawable d = new BitmapDrawable(getResources(), bmp); 

      ImageToLoad iLoad = new ToasterToLoadDrawableResource(d, file.getName()); 

      bitmapImageView.add(iLoad); 



     } 
     Toast.makeText(getApplicationContext(), String.valueOf("list size"+bitmapImageView.size()), Toast.LENGTH_LONG).show(); 
     if (bitmapImageView.isEmpty()) 
     { 
      btnOK.setEnabled(false); 
     } 
     else 
     { 
      btnOK.setEnabled(true); 
     } 


     adapter.notifyDataSetChanged(); 
     childCount = scroller.getChildCount(); 
     scroller.setSelection(bitmapImageView.size()-1); 

    } 
    else 
    { 
     targetDirector.mkdirs(); 
    } 
    } 
+0

謝謝您的理解與合作! –

+0

@AndrewBarber:我很榮幸能夠與版主合作。 –

+0

@AndrewBarber:嘿安德魯,你忘了做一件事,其實我把我的名字改成了'Jon Skeet'的整個SE檔案。我認爲你只是改變了我的名字,SE的其他網站仍然顯示我的名字爲Jon Skeet。我想讓你注意。 –

回答

0

我解決了這個問題。我正在給那些可能會像我一樣遇到同樣問題的人提供答案。其實問題不在於從目錄列出文件。它工作正常。但是當我拍照時,listfiles會在圖片字節寫入sdcard文件夾之前獲取文件列表。所以我通過只在字節寫入文件夾後才獲取文件來改變編碼。我只是調用像這樣的文件加載方法CameraTestActivity.LoadImagefromSD();以下是它的編碼。

/// Handles data for jpeg picture 
    private PictureCallback jpegCallback = new PictureCallback() 
    { 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) 
     { 
     //immediately start the preview again 
     ///@see http://developer.android.com/reference/android/hardware/Camera.html#takePicture%28android.hardware.Camera.ShutterCallback,%20android.hardware.Camera.PictureCallback,%20android.hardware.Camera.PictureCallback,%20android.hardware.Camera.PictureCallback%29 
     if (mCamera != null) 
      mCamera.startPreview(); 

     FileOutputStream outStream = null; 
     try { 
      // Write to SD Card 
       outStream = new FileOutputStream(String.format(Environment.getExternalStorageDirectory().getAbsolutePath()+"/images/%d.jpg", 
      System.currentTimeMillis())); 
       // outStream = new FileOutputStream(String.format("/data/data/com.mattikariluoma.cameratest/files/images/%d.jpg", 
      outStream.write(data); 
      outStream.close(); 
      Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); 
      CameraTestActivity.LoadImagefromSD(); 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
     } 

     Log.d(TAG, "onPictureTaken - jpeg"); 
     } 
    }; 

希望它能幫助別人。

相關問題