2013-10-30 16 views
8

Tôi đang làm việc trên một hoạt động Máy ảnh tùy chỉnh cho ứng dụng của mình. Tôi đã làm theo hướng dẫn từ trang web dành cho nhà phát triển Android tại đây: http://developer.android.com/guide/topics/media/camera.html Mọi thứ có vẻ hoạt động tốt, ngoại trừ chức năng Gọi lại không được gọi và hình ảnh không được lưu. Đây là mã của tôi:Chức năng chụp ảnh Máy ảnh Android không gọi chức năng Gọi lại

public class CameraActivity extends Activity { 
private Camera mCamera; 
private CameraPreview mPreview; 
private static final String TAG = "CameraActivity"; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.camera); 

    // Create an instance of Camera 
    mCamera = getCameraInstance(); 

    // Create our Preview view and set it as the content of our activity. 
    mPreview = new CameraPreview(this, mCamera); 
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
    preview.addView(mPreview); 

    Button captureButton = (Button) findViewById(R.id.button_capture); 
    captureButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.v(TAG, "will now take picture"); 
      mCamera.takePicture(null, null, mPicture); 
      Log.v(TAG, "will now release camera"); 
      mCamera.release(); 
      Log.v(TAG, "will now call finish()"); 
      finish(); 
     } 
    });   
} 

private PictureCallback mPicture = new PictureCallback() { 

    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     Log.v(TAG, "Getting output media file"); 
     File pictureFile = getOutputMediaFile(); 
     if (pictureFile == null) { 
      Log.v(TAG, "Error creating output file"); 
      return; 
     } 
     try { 
      FileOutputStream fos = new FileOutputStream(pictureFile); 
      fos.write(data); 
      fos.close(); 
     } catch (FileNotFoundException e) { 
      Log.v(TAG, e.getMessage()); 
     } catch (IOException e) { 
      Log.v(TAG, e.getMessage()); 
     } 
    } 
}; 

private static File getOutputMediaFile() { 
    String state = Environment.getExternalStorageState(); 
    if (!state.equals(Environment.MEDIA_MOUNTED)) { 
     return null; 
    } 
    else { 
     File folder_gui = new File(Environment.getExternalStorageDirectory() + File.separator + "GUI"); 
     if (!folder_gui.exists()) { 
      Log.v(TAG, "Creating folder: " + folder_gui.getAbsolutePath()); 
      folder_gui.mkdirs(); 
     } 
     File outFile = new File(folder_gui, "temp.jpg"); 
     Log.v(TAG, "Returnng file: " + outFile.getAbsolutePath()); 
     return outFile; 
    } 
} 

Sau khi nhấp vào nút, tôi nhận nhật ký: "bây giờ sẽ chụp ảnh", "bây giờ sẽ gọi kết thúc". Các hoạt động kết thúc thành công, nhưng các chức năng gọi lại không được gọi trong chức năng

mCamera.takePicture(null, null, mPicture); 

(Không có các bản ghi từ callback mPicture hoặc các chức năng getMediaOutputFile) và không có tập tin trong vị trí đó đã được chỉ định.

Bất kỳ ý tưởng nào? :) Cảm ơn rất nhiều!

+0

Tôi cần một số trợ giúp cho nhau trong C# .. Hãy –

Trả lời

5

Cuộc gọi đến mCamera.takePicture() không đồng bộ. Điều đó có nghĩa là cuộc gọi hoàn tất ngay lập tức, nhưng việc chụp và xử lý ảnh thực tế xảy ra đôi khi sau đó. Tuy nhiên, bạn làm điều này ngay khi trở về từ cuộc gọi đến mCamera.takePicture():

Log.v(TAG, "will now release camera"); 
mCamera.release(); 
Log.v(TAG, "will now call finish()"); 
finish(); 

Điều đó có nghĩa rằng bạn đã phát hành các nguồn lực máy ảnh và hoàn thành Hoạt động trước khi máy ảnh được một cơ hội để thực sự chụp ảnh và gọi lại cho bạn.

Bạn cần di chuyển mã đó vào phương thức gọi lại onPictureTaken() để bạn giải phóng tài nguyên và hoàn thành Hoạt động sau khi gọi lại xảy ra.

+0

Vâng đó là đơn giản. .. Tôi kindda ngạc nhiên tôi không thể tìm thấy một câu hỏi tương tự ở đây. Dù sao, đã làm điều đó, cảm ơn bạn rất nhiều :) –

+0

Tôi không gọi 'mCamera.release()' cũng không 'kết thúc()', và vẫn còn có vấn đề này. Vì vậy, một cái gì đó khác có thể đang xảy ra. –

+0

@IgorGanapolsky có thể bạn nên mở một câu hỏi mới thay vì thêm nhận xét vào câu trả lời này. Rõ ràng tình hình của bạn là khác nhau. Các poster ban đầu dường như hài lòng với câu trả lời này. –

0

làm nó như thế này để chụp nhiều ảnh một lần Bấm Sử dụng SurfaceView Tuỳ chỉnh camera

clickbtn.setOnClickListener(new OnClickListener() { 

     @SuppressWarnings("deprecation") 
     @Override 
     public void onClick(View v) { 

      for (int i = 0; i < 5; i++) { 
       mcamera = mPreview.getCamera(); 

       getimage(mcamera); 

       Toast.makeText(getApplicationContext(), 
         "multiple image count=" + i, 1000).show(); 

      } 

      if (mPreview == null) { 
       mPreview = new CamLayer(MainActivity.this); 
      } 


     } 
    }); 

public static void getimage(Camera mcamera) { 


    PictureCallback mPicture = new PictureCallback() { 

     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
      pictureFile = getOutputMediaFile(); 
      Log.e("path file 11111111", ""+pictureFile); 
      if (pictureFile == null) { 
       return; 
      } 
      try { 
       FileOutputStream fos = new FileOutputStream(pictureFile); 
       fos.write(data); 
       fos.close(); 

      } catch (FileNotFoundException e) { 

      } catch (Exception e) { 

      } 
     } 
    }; 
    try { 

     mcamera.startPreview(); 
     mcamera.takePicture(null, null, mPicture); 
     Thread.sleep(2000); 

    } catch (Exception exception) { 
     exception.printStackTrace(); 
    } 

} 

private static File getOutputMediaFile() { 
    File mediaStorageDir = new File(
      Environment 
        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
      "Sunil3"); 
    if (!mediaStorageDir.exists()) { 
     if (!mediaStorageDir.mkdirs()) { 

      return null; 
     } 
    } 


    File mediaFile = new File(String.format(mediaStorageDir+File.separator+"%d.jpg", System.currentTimeMillis())); 

    return mediaFile; 
} 
+0

Tại sao bạn chuyển giá trị rỗng vào tham số phương thức 'takePicture'? –

Các vấn đề liên quan