2014-10-06 25 views
6

Tôi có thể nhấn nút, mở ứng dụng máy ảnh gốc và chụp thành công ảnh. Nhưng sau đó khi tôi kiểm tra ứng dụng Bản xứ hoặc Ảnh trên điện thoại của tôi, ảnh không được lưu ở đó. Tôi rất mới với Android nên có khả năng tôi thiếu một số thứ quan trọng trong mã của mình.Máy ảnh không được lưu sau khi chụp ảnh

Câu hỏi:

1) Các ảnh này được lưu ở đâu?

2) Tôi có thể sửa đổi mã bên dưới bằng cách nào đó để lưu thay vì lưu trữ nội bộ, vì vậy tất cả hình ảnh được chụp bằng ứng dụng của tôi là riêng tư và chỉ có thể truy cập thông qua ứng dụng của tôi?

3) Nếu tôi muốn lưu các ảnh này vào một đối tượng, cùng với một số văn bản/đầu vào khác, thì cách nào là tốt nhất? Tôi có nên lưu Uri hoặc một số số nhận dạng để tham chiếu hình ảnh sau này hoặc lưu hình ảnh BitMap thực tế không?

Bất kỳ trợ giúp nào được đánh giá cao, cảm ơn!

Đây là mã của tôi để chụp ảnh:

mImageButton.setOnClickListener(new View.OnClickListener() 
{ 
    public void onClick(View v) 
    { 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     imageUri = CameraUtils.getOutputMediaFileUri(CameraUtils.MEDIA_TYPE_IMAGE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
     startActivityForResult(intent, REQUEST_IMAGE); 
    } 
} 

CameraUtils lớp lấy thẳng từ Google developer guides:

public static Uri getOutputMediaFileUri(int type) 
{ 
    return Uri.fromFile(getOutputMediaFile(type)); 
} 

public static File getOutputMediaFile(int type) 
{ 
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES), "camera"); 

    if (!mediaStorageDir.exists()) 
    { 
     if (!mediaStorageDir.mkdirs()) 
     { 
      return null; 
     } 
    } 

    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File mediaFile; 
    if (type == MEDIA_TYPE_IMAGE) 
    { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
       "IMG_" + timeStamp + ".jpg"); 
    } 
    else if(type == MEDIA_TYPE_VIDEO) 
    { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
       "VID_" + timeStamp + ".mp4"); 
    } 
    else 
    { 
     return null; 
    } 

    return mediaFile; 
} 

Trả lời

4

1) Bằng cách nhìn vào mã này, tôi mong đợi những hình ảnh được được lưu trong thư mục có tên 'camera' sẽ được tìm thấy trong thư mục Ảnh trên thiết bị của bạn (bộ nhớ ngoài). Những thứ này có thể không xuất hiện ngay trong thư viện của bạn, tuy nhiên trong các phiên bản sau của Android (Kitkat và có thể là jelly-bean mặc dù tôi không thể xác minh ngay bây giờ), bạn sẽ có thể mở ứng dụng Ảnh và tìm chúng ở đâu đó trong đó. Nếu đó không phải là trường hợp, sau đó khởi động một ứng dụng thám hiểm tập tin (ví dụ ứng dụng là ASTRO File Manager hoặc X-Plore) và duyệt đến thư mục Pictures/camera, nơi bạn sẽ thấy hình ảnh của bạn. Lần tới khi phương tiện của bạn được lập chỉ mục lại (khởi động lại điện thoại hoặc chỉ mục lại được kích hoạt từ nơi khác), bạn sẽ thấy những ảnh này trong các ứng dụng thư viện/ảnh của mình. Nếu bạn muốn làm mới phương tiện của mình theo cách lập trình, here có thể hữu ích. Cuối cùng, hãy đảm bảo bạn có quyền READ_EXTERNAL_STORAGE trong tệp kê khai Android của bạn như được chỉ định this (tài liệu Android).

2) Nếu bạn muốn lưu hình ảnh chỉ khả dụng cho ứng dụng của mình, bạn cần lưu chúng vào thư mục dữ liệu nội bộ của ứng dụng. Hãy xem this trực tiếp từ tài liệu Android. Đảm bảo sử dụng cờ MODE_PRIVATE.

3) Đối với điều này, bạn sẽ muốn lưu trữ đường dẫn tệp ở nơi nào đó có thể truy cập vào ứng dụng của bạn. Bạn có thể lưu đường dẫn tệp của bạn vào một tệp văn bản với một số dữ liệu văn bản khác hoặc bạn có thể sử dụng cơ sở dữ liệu sqlite. Cuối cùng, bạn có thể sử dụng ORM như ORMLite cho Android để lưu một đối tượng java có thể chứa dữ liệu cho ảnh của bạn và có một số trường bạn muốn tồn tại (tiêu đề, mô tả, đường dẫn, v.v.). Herehere là phần giới thiệu về cách bắt đầu với cơ sở dữ liệu SQLite trong Android (ngay từ tài liệu chính thức). Nếu bạn muốn sử dụng ORMLite, có rất nhiều thông tin trên trang web của họ here. Nhà phát triển đã dành rất nhiều thời gian trả lời các câu hỏi về StackOverflow ..

Tất cả các câu hỏi của bạn có thể được trả lời bằng một số tìm kiếm đơn giản trên Google. Chúng rất chuẩn và cơ bản để làm trong Android, vì vậy bạn có thể tìm thấy rất nhiều thông tin và hướng dẫn trực tuyến.

EDIT:

Đáp lại bình luận của bạn về câu hỏi thứ hai. Đây là những gì tôi có thể làm (hoặc một cái gì đó tương tự):

Lưu ý rằng tôi đã không kiểm tra điều này. Nó từ đỉnh đầu tôi. Nếu bạn có nhiều vấn đề bình luận ở đây!

đang Hoạt động ...

mImageButton.setOnClickListener(new View.OnClickListener() 
{ 
    public void onClick(View v) 
    { 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     imageUri = CameraUtils.getOutputMediaFileUri(currentActivity, CameraUtils.MEDIA_TYPE_IMAGE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
     startActivityForResult(intent, REQUEST_IMAGE); 
    } 
} 

public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (requestCode == REQUEST_IMAGE) 
    { 
     if (resultCode == RESULT_OK) 
     { 
      String pathToInternallyStoredImage = CameraUtils.saveToInternalStorage(this, imageUri); 
      // Load the bitmap from the path and display it somewhere, or whatever 
     } 
     else if (resultCode == RESULT_CANCELED) 
     { 
      //Cancel code 
     } 
    } 
} 

CameraUtils lớp mã ...

public static Uri getOutputMediaFileUri(int type) 
{ 
    return Uri.fromFile(getOutputMediaFile(type)); 
} 

public static File getOutputMediaFile(int type) 
{ 
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES), "camera"); 

    createMediaStorageDir(mediaStorageDir); 

    return createFile(type, mediaStorageDir); 
} 

private static File getOutputInternalMediaFile(Context context, int type) 
{ 
    File mediaStorageDir = new File(context.getFilesDir(), "myInternalPicturesDir"); 

    createMediaStorageDir(mediaStorageDir); 

    return createFile(type, mediaStorageDir); 
} 

private static void createMediaStorageDir(File mediaStorageDir) // Used to be 'private void ...' 
{ 
    if (!mediaStorageDir.exists()) 
    { 
     mediaStorageDir.mkdirs(); // Used to be 'mediaStorage.mkdirs();' 
    } 
} // Was flipped the other way 

private static File createFile(int type, File mediaStorageDir) // Used to be 'private File ...' 
{ 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File mediaFile = null; 
    if (type == MEDIA_TYPE_IMAGE) 
    { 
     mediaFile = new File(mediaStorageDir .getPath() + File.separator + 
       "IMG_" + timeStamp + ".jpg"); 
    } 
    else if(type == MEDIA_TYPE_VIDEO) 
    { 
     mediaFile = new File(mediaStorageDir .getPath() + File.separator + 
       "VID_" + timeStamp + ".mp4"); 
    } 
    return mediaFile; 
} 

public static String saveToInternalStorage(Context context, Uri tempUri) 
{ 
    InputStream in = null; 
    OutputStream out = null; 

    File sourceExternalImageFile = new File(tempUri.getPath()); 
    File destinationInternalImageFile = new File(getOutputInternalMediaFile(context).getPath()); 

    try 
    { 
     destinationInternalImageFile.createNewFile(); 

     in = new FileInputStream(sourceExternalImageFile); 
     out = new FileOutputStream(destinationInternalImageFile); 

     // Transfer bytes from in to out 
     byte[] buf = new byte[1024]; 
     int len; 
     while ((len = in.read(buf)) > 0) 
     { 
      out.write(buf, 0, len); 
     } 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
     //Handle error 
    } 
    finally 
    { 
     try { 
      if (in != null) { 
       in.close(); 
      } 
      if (out != null) { 
       in.close(); 
      } 
     } catch (IOException e) { 
      // Eh 
     } 
    } 
    return destinationInternalImageFile.getPath(); 
} 

Vì vậy, bây giờ bạn có đường dẫn trỏ đến hình ảnh được lưu trữ nội bộ của bạn, mà bạn có thể sau đó thao tác/tải từ onActivityResult của bạn.

+0

Cảm ơn bạn đã trả lời! Về phần 2, tôi đã thấy phần tài liệu đó trước đây, nhưng tôi không chắc chắn cách triển khai nó vào ứng dụng của mình. Bạn có biết bất kỳ ví dụ nào cho thấy cách thực hiện nó không? Tôi chỉ có thể tìm thấy đoạn mã. – pez

+0

Cảm ơn bạn một lần nữa! Chạy mã của bạn trên điện thoại của tôi, nó luôn luôn có vẻ đóng băng trong ứng dụng máy ảnh ngay sau khi tôi chụp ảnh. Sử dụng 'Log.d', có vẻ như mọi thứ được gọi, và logcat không hiển thị bất kỳ lỗi nào. Nhưng sau khi tôi chụp ảnh, nó sẽ không cho phép tôi xác nhận nó bằng dấu kiểm trong ứng dụng máy ảnh gốc; Tôi chỉ có thể nhấn "x" để chụp lại ảnh hoặc nhấn nút Home hoặc Back trên thanh điều hướng của điện thoại. – pez

+1

Bạn có ba quyền này trong tệp kê khai Android của mình không? '' '' ' ' Bạn thực sự chỉ cần có quyền ghi để lưu hình ảnh (cũng như tính năng camera mà tôi tin). Nhưng thông thường đọc được bao gồm cũng vì bạn có thể sẽ cần nó. – maraci

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