2013-05-18 99 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"); 
     } 
    }; 

希望它能帮助别人。

相关问题