33

Tôi đang gặp sự cố khi chụp ảnh và lưu trữ hình ảnh từ ứng dụng máy ảnh gốc. Đây là mẫu của một số mã của tôi.Cách chụp ảnh và lưu hình ảnh bằng Máy ảnh Android gốc

_path = Environment.getExternalStorageDirectory() + "make_machine_example.jpg"; 
File file = new File(_path); 
Uri outputFileUri = Uri.fromFile(file); 

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

startActivityForResult(intent, 0); 

Sau khi ảnh đã được chụp và quay lại hoạt động ban đầu, Khi tôi điều hướng đến thẻ SD thông qua Android DDMS File Explorer, ảnh không có ở đó. Bất cứ ai biết tại sao điều này không được lưu?

+0

Xin chào tất cả, tôi muốn chụp ảnh bằng camera Native Android và lưu nó ..so mà tôi đã thực hiện bounty becoz phiền với nó –

+0

Paresh các vấn đề của bạn với việc chụp ảnh là gì? Cách tiếp cận được hiển thị trong câu hỏi này có hiệu quả với bạn không? – Janusz

+0

@Janusz Tôi phải đặt một Textview (tên hoạt động), một nút (ở phía dưới) và ở giữa màn hình, xem trước máy ảnh ở đó và trên sự kiện bấm nút, ảnh cần được nhấp và ảnh sẽ bị bỏ qua trong lần xem của người khác hoạt động –

Trả lời

20

Bạn đã kiểm tra kết xuất của Environment.getExternalStorageDirectory() là gì, bởi vì nếu nó không chứa một tập tin đuôi (/) thì hình ảnh của bạn sẽ kết thúc trong một thư mục không nằm trên SDcard như:

/mnt/sdcardmake_machine_example.jpg 

Khi những gì bạn thực sự muốn là:

/mnt/sdcard/make_machine_example.jpg 

Hãy thử mã này thay vì:

_path = Environment.getExternalStorageDirectory() + File.separator + "make_machine_example.jpg"; 
+2

có, tôi có thể xác nhận rằng bạn sẽ cần phải thêm dấu tách tệp –

14

1. Chỉ cần sử dụng

new File(Environment.getExternalStorageDirectory(), "make_machine_example.jpg"); 

và đừng lo lắng về dấu phân cách.

2. Đối mặt với cùng một vấn đề trước đây. Điện thoại SenseUI có ứng dụng máy ảnh tùy chỉnh không tạo tệp. Bạn đang sử dụng thiết bị nào? Nó có thể đã được cố định trong các thiết bị mới nhất nhưng nó vẫn có thể là một vấn đề. Vì vậy, đây là một mẫu hoàn chỉnh làm thế nào để vượt qua nó Problems saving a photo to a file.

25

Dưới đây là sản phẩm cuối cùng trong trường hợp bất cứ ai vẫn ghé thăm chủ đề này:

public class CameraCapture extends Activity { 

    protected boolean _taken = true; 
    File sdImageMainDirectory; 

    protected static final String PHOTO_TAKEN = "photo_taken"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     try { 

      super.onCreate(savedInstanceState);   
        File root = new File(Environment 
          .getExternalStorageDirectory() 
          + File.separator + "myDir" + File.separator); 
        root.mkdirs(); 
        sdImageMainDirectory = new File(root, "myPicName"); 


       startCameraActivity(); 
      } 
     } catch (Exception e) { 
      finish(); 
      Toast.makeText(this, "Error occured. Please try again later.", 
        Toast.LENGTH_SHORT).show(); 
     } 

    } 

    protected void startCameraActivity() { 

     Uri outputFileUri = Uri.fromFile(sdImageMainDirectory); 

     Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

     startActivityForResult(intent, 0); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (resultCode) { 
     case 0: 
      finish(); 
      break; 

     case -1: 

      try { 
       StoreImage(this, Uri.parse(data.toURI()), 
         sdImageMainDirectory); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      finish(); 
      startActivity(new Intent(CameraCapture.this, Home.class)); 

     } 

    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     if (savedInstanceState.getBoolean(CameraCapture.PHOTO_TAKEN)) { 
      _taken = true; 
     } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     outState.putBoolean(CameraCapture.PHOTO_TAKEN, _taken); 
    } 

     public static void StoreImage(Context mContext, Uri imageLoc, File imageDir) { 
     Bitmap bm = null; 
     try { 
      bm = Media.getBitmap(mContext.getContentResolver(), imageLoc); 
      FileOutputStream out = new FileOutputStream(imageDir); 
      bm.compress(Bitmap.CompressFormat.JPEG, 100, out); 
      bm.recycle(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

} 
+1

Bạn có cần đặt quyền bổ sung trong tệp kê khai không? Tôi không thể đặt tên riêng cho tệp hình ảnh được lưu vào sd – Vincent

+0

có ... \t ninjasense

+0

Xin chào Ninja !! Tôi có thể biết, "Home.class" là gì ???? nói của nó để tạo ra một lớp/enum vv i am mới để lập trình Android. – iankits

-5

Thêm dòng này vào AndroidManifest.xml tập tin và loại bỏ phần mở rộng make_machine_example:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Nó sẽ bắt đầu để chụp ảnh và lưu trữ vào SDcard.

+0

nó sẽ không lưu trữ hình ảnh đã chụp. –

1

Bạn nên thực hiện một quét phương tiện truyền thông sau khi lưu hình ảnh

sendBroadcast(new Intent(
      Intent.ACTION_MEDIA_MOUNTED, 
      Uri.parse("file://" + Environment.getExternalStorageDirectory())));