2010-04-23 37 views
8

Người đàn ông, tôi vẫn còn không thể lưu ảnh khi tôi gửi ý định yêu cầu chụp ảnh. Đây là những gì tôi đang làm:Sự cố khi lưu ảnh vào tệp

  1. Thực hiện một URI đại diện cho tên đường dẫn

    android.content.Context c = getApplicationContext(); 
    
    String fname = c.getFilesDir().getAbsolutePath()+"/parked.jpg"; 
    
    java.io.File file = new java.io.File(fname); 
    
    Uri fileUri = Uri.fromFile(file); 
    
  2. Tạo mục đích? (! Đừng quên tên pkg) và bắt đầu hoạt động

    private static int TAKE_PICTURE = 22; 
    
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    
    intent.putExtra("com.droidstogo.boom1." + MediaStore.EXTRA_OUTPUT, fileUri); 
    startActivityForResult(intent, TAKE_PICTURE); 
    
  3. Hoạt động của máy ảnh bắt đầu và tôi có thể chụp ảnh và chấp nhận nó. My onActivityResult() sau đó được gọi. Nhưng tệp của tôi không được viết. URI là: tệp: ///data/data/com.droidstogo.boom1/files/parked.jpg

  4. Tôi có thể tạo hình thu nhỏ OK (không đưa thêm vào Intent) và có thể viết tập tin OK, và sau đó đọc nó trở lại).

Có ai có thể nhìn thấy lỗi đơn giản nào tôi đang thực hiện không? Không có gì hiển thị rõ ràng trong logcat - máy ảnh rõ ràng đang chụp ảnh. Cảm ơn,

Peter


tôi nên đề cập đến mà tôi có quyền thích hợp thiết lập trong file AndroidManifest.xml:

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

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

    <uses-feature android:name="android.hardware.camera" /> 
    <uses-library android:name="com.google.android.maps" /> 



</application> 

Bất kỳ ý tưởng? Bất kỳ ý tưởng nào về những điều cần thử, để có thêm thông tin về vấn đề này?

+0

bạn có thể vui lòng đặt một số mã để hiểu rõ hơn về sự cố – the100rabh

+0

Có lẽ [câu hỏi] này (http://stackoverflow.com/questions/649057/how-do-i-save-data-from-camera-to- đĩa-sử dụng-mediastore-on-android) có thể giúp đỡ. – kgiannakakis

Trả lời

1

Có phải vì bạn đã thêm một dấu chấm thêm:

intent.putExtra("com.droidstogo.boom1." 

Thay vì:.

intent.putExtra("com.droidstogo.boom1" 
1

Vấn đề của bạn có thể là với các thư mục mà bạn đang cố gắng để lưu trữ các tập tin trong Để lưu tệp vào thẻ SD bạn không cần bất kỳ quyền đặc biệt nào, nhưng cách bạn nhận được tham chiếu thư mục khác với cách bạn đã thực hiện. Nó cũng phụ thuộc vào việc bạn có muốn lưu hình ảnh theo cách có thể được lấy bởi MediaStore (tức là những thứ như ứng dụng thư viện hoặc album hoặc bất kỳ ứng dụng nào khác dựa vào hình ảnh đó để tìm hình ảnh) hay không. Giả sử bạn muốn nó được liệt kê trong MediaStore, đây là đoạn code để làm điều đó:

ContentValues newImage = new ContentValues(2); 
newImage.put(Media.DISPLAY_NAME, "whatever name you want shown"); 
newImage.put(Media.MIME_TYPE, "image/png"); 

Uri uri = contentResolver.insert(Media.EXTERNAL_CONTENT_URI, newImage); 

try { 
    Bitmap bitmap = //get your bitmap from the Camera, however that's done 
    OutputStream out = contentResolver.openOutputStream(uri); 
    boolean success = bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); 
    out.close(); 
    if (success){ 
     Log.d("Image Writer", "Image written successfully.");     
    } else { 
     Log.d("Image Writer", "Image write failed, but without an explanation."); 
    } 

} catch (Exception e){ 
    Log.d("Image Writer", "Problem with the image. Stacktrace: ", e); 
} 

Mở giả lập chạy v1.5 của tôi, đó là tiết kiệm thành công một bitmap vào thẻ SD trong DCIM thư mục/Camera của nó tên tệp là thời gian hiện tại. (Hiện đang lưu trong mili giây kể từ ngày 01 tháng 1 năm 1970, còn được gọi là "Kỷ nguyên" đối với một số lý do.)

+0

Chỉ cần để nitpick ... để lưu tệp vào SDCard bạn KHÔNG phải có quyền. Tôi nghĩ rằng điều này đã thay đổi ở cấp độ api 4. –

+0

@fiXedd: Chỉ cần để nitpick đổi lại: P Hóa ra bạn đúng rằng họ đã giới thiệu yêu cầu để có quyền write_external_storage để ghi vào thẻ SD. Trên v1.5, nó hoạt động tốt mà không có, nhưng trên v2.1 nó yêu cầu sự cho phép. Tuy nhiên, để ghi vào Media Store, trên cả 2.1 và 1.5 không có quyền xuất hiện được yêu cầu. –

7
  1. Như Steve H nói bạn không thể chỉ sử dụng file: /// dữ liệu/dữ liệu/com.droidstogo.boom1/files/parked.jpg cho điều đó. Đó là thư mục cá nhân và máy ảnh ứng dụng của bạn không thể viết ở đó. Bạn có thể sử dụng một số tập tin thẻ SD ví dụ - nó có sẵn cho tất cả.

  2. Như stealthcopter đã nói, mục đích bổ sung chỉ là MediaStore.EXTRA_OUTPUT không có tên gói của bạn.

  3. Không phải vấn đề chỉ là FYI. Tôi đoán không có quyền nào bạn chỉ định thực sự được yêu cầu cho thao tác này.

Dưới đây là mẫu mã của tôi:

final int REQUEST_FROM_CAMERA=1; 

private File getTempFile() 
{ 
    //it will return /sdcard/image.tmp 
    return new File(Environment.getExternalStorageDirectory(), "image.tmp"); 
} 

private void getPhotoClick() 
{ 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(getTempFile())); 
    startActivityForResult(intent, REQUEST_FROM_CAMERA); 
} 


protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_FROM_CAMERA && resultCode == RESULT_OK) { 
    InputStream is=null; 

    File file=getTempFile(); 
    try { 
     is=new FileInputStream(file); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

    //On HTC Hero the requested file will not be created. Because HTC Hero has custom camera 
    //app implementation and it works another way. It doesn't write to a file but instead 
    //it writes to media gallery and returns uri in intent. More info can be found here: 
    //http://stackoverflow.com/questions/1910608/android-actionimagecapture-intent 
    //http://code.google.com/p/android/issues/detail?id=1480 
    //So here's the workaround: 
    if(is==null){ 
     try { 
      Uri u = data.getData(); 
      is=getContentResolver().openInputStream(u); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 

    //Now "is" stream contains the required photo, you can process it 
    DoSomeProcessing(is); 

    //don't forget to remove the temp file when it's not required. 
    } 

} 
0

Như Steve nói, bạn nên lưu hình ảnh của bạn trong thẻ SD của bạn. Thư mục mà bạn đang cố gắng lưu là riêng tư và trừ khi bạn có thiết bị của bạn bắt nguồn từ, bạn sẽ không thể viết ở đó. Hãy thử thay thế dòng này:

String fname = c.getFilesDir().getAbsolutePath()+"/parked.jpg"; 

với dòng này

String fname = Environment.getExternalStorageDirectory().getAbsolutePath() + "somePathYouKnownExists" + +"/parked.jpg"; 

này nên là đủ.

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