2014-07-01 17 views
6

Tôi đã đọc rất nhiều câu hỏi liên quan đến vấn đề này. Một số tương tự với những gì tôi đang trải qua; Tôi đã thử các câu trả lời không thành công. Mã hoạt động trên HTC Android 4.2 và không hoạt động trên Nexus 7 Android 4.4. Tôi đã sửa đổi thư mục lưu trữ để hoạt động trên Android 4.4, vì vậy đây không phải là vấn đề.Máy ảnh Mục đích không quay lại gọi điện thoại Hoạt động

camera Mục đích không bao giờ trở lại nếu tôi sử dụng

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 

và không trở lại nếu tôi sử dụng

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoFile); 

nhưng nó không lưu các tập tin.

Đây là mã đầy đủ. Gọi mục đích

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
if (takePictureIntent.resolveActivity(manager) != null) 
{ 
    try 
    { 
     final File photoFile = createImageFile(); 

     if (photoFile != null) 
     { 
      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 
      //takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoFile); 
      startActivityForResult(takePictureIntent, 1); 
     } 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 

Tên tập tin

private File createImageFile() throws IOException 
{ 
    if (mStorageDirectory == null) 
    { 
     createInitialStorageDirectory(); 
     setupFolders(); 
     mScrollList.notifyDataSetInvalidated(); 
    } 

    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "slide_" + timeStamp; 
    File storageDir = new File(mStorageDirectory); 
    File image = File.createTempFile(imageFileName, ".jpg", storageDir); 
//  image.setWritable(true, false); 

    // Save a path for use with ACTION_VIEW intents 
    mCurrentPhotoPath = image.getAbsolutePath(); 
    return image; 
} 

Các hàm callback

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == 1 && resultCode == -1) 
    { 

    } 
} 

Các thư mục gốc cộng với lưu thư mục

static String mBasePath = "/slides/"; 

private String getRootDirectory() 
{ 
    String state = Environment.getExternalStorageState(); 
    if (Environment.MEDIA_MOUNTED.equals(state)) 
    { 
     if (Build.VERSION.SDK_INT >= 19) 
      return mView.getContext().getFilesDir() + mBasePath; 
     else 
      return Environment.getExternalStorageDirectory() + "/Android/data/com.hdms.manager" + mBasePath; 
     //return Environment.getExternalStorageDirectory() + mBasePath; 
    } 

    return mBasePath; 
} 

Bất kỳ suy nghĩ w ould được đánh giá cao.

Trả lời

6

Vì vậy, tôi đã tìm thấy giải pháp cho vấn đề của mình. Nếu một tệp không tồn tại thì Hoạt động của máy ảnh sẽ không trả lại. Tôi đoán lý do mà nó không hoạt động trên 4.4 là sự thay đổi hệ thống tập tin. Tôi không lưu hình ảnh vào thư viện phương tiện và tải tệp trở lại thư mục ứng dụng của tôi. Tệp phương tiện sau đó sẽ bị xóa. Lý do mà tôi không để nó trong thư mục phương tiện truyền thông, là khi ứng dụng bị xóa để hình ảnh sẽ bị xóa.

Đây là mã mới. Đầu tiên, ý định gọi

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
if (takePictureIntent.resolveActivity(manager) != null) 
{ 
    ContentValues values = new ContentValues(); 
    values.put(MediaStore.Images.Media.TITLE, "New Picture"); 
    values.put(MediaStore.Images.Media.DESCRIPTION,"From your Camera"); 
    Uri mImageUri = App.mApplication.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 

    mCurrentPhotoPath = mImageUri.getPath(); 

    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); 
    startActivityForResult(takePictureIntent, 1); 
} 

Sau đó gọi lại.

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == 1 && resultCode == -1) 
    { 
     if (data != null) 
      mCurrentPhotoPath = String.valueOf(data.getData()); 

     String[] filePathColumn = {MediaStore.Images.Media.DATA}; 

     Cursor cursor = App.mApplication.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, filePathColumn, null, null, null); 
     if (cursor == null) 
      return; 
     // find the file in the media area 
     cursor.moveToLast(); 

     int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
     String filePath = cursor.getString(columnIndex); 
     File source = new File(filePath); 
     cursor.close(); 
     // create the destination file 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     String imageFileName = "slide_" + timeStamp; 
     File destination = new File(mStorageDirectory, imageFileName + ".jpg"); 

     // copy the data 
     if (source.exists()) 
     { 
      try 
      { 
       FileChannel src = new FileInputStream(source).getChannel(); 
       FileChannel dst = new FileOutputStream(destination).getChannel(); 
       dst.transferFrom(src, 0, src.size()); 
       src.close(); 
       dst.close(); 

       source.delete(); 
      } 
      catch (FileNotFoundException e) 
      { 
       e.printStackTrace(); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+0

nhờ, mã này làm việc :) – chathura

6

Trong trường hợp của tôi, nó không trả về vì tệp đầu ra nằm trong thư mục mà tôi chưa tạo.

Nếu đó là trường hợp đối với người khác, làm được điều này trước khi bắt đầu anintent:

file.getParentFile().mkdirs(); 
+5

Không phải là nó một lỗi khung android rằng trong giao diện điều khiển android không có IOException (ví dụ: NoSuchFileOrDirecrtoy) hoặc theo dõi nhật ký để thông báo cho chúng tôi về lý do khiến hoạt động bị kẹt? làm thế nào chúng ta giả sử để hiểu những gì happend (ngoài việc mở stackoverflow ...) – GyRo

+0

Cảm ơn bạn rất nhiều ... tôi đã dành rất nhiều thời gian, cuối cùng đã giải quyết ... –

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