2011-11-22 35 views
5

Tôi gọi camera để chụp ảnh. Nhưng tôi không thể quay trở lại hoạt động ban đầu của chính mình sau khi chụp ảnh. Có chuyện gì vậy? Cảm ơn bạn.Cách quay lại từ mục đích gọi

public void addEntry(View view) 
{ 
       String EntryName=RegisterName.toString(); 
       Toast.makeText(this, EntryName, Toast.LENGTH_LONG); 
       Intent addEntryintent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       File file = new File(getFilesDir(),EntryName); 
       registeryFileUri = Uri.fromFile(file); 
       addEntryintent.putExtra(MediaStore.EXTRA_OUTPUT, registeryFileUri); 
       startActivityForResult(addEntryintent,TAKE_PICTURE);   

} 


@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == TAKE_PICTURE) 
     { 
      if (data != null) 
      { 
     Toast.makeText(this, "Successfully Registered!", Toast.LENGTH_LONG); 
     ImageView Registerimage= (ImageView)findViewById(R.id.RegisterPicture); 
     Registerimage.setImageURI(registeryFileUri); 
     } 

    } 
    } 
+0

Bạn quên gọi 'Toast.show(); 'inside' onActivityResult() '. Nó phải là 'Toast.makeText (điều này," Đã đăng ký thành công! ", Toast.LENGTH_LONG) .show();' –

Trả lời

4

trả lời

Sử dụng appContext.getExternalCacheDir() và đừng quên đề cập đến permissons.

@Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
       if (requestCode == TAKE_PICTURE) 
       { 
         if(resultCode==Activity.RESULT_OK) 
        { //if (data != null) 
        //{ 
        Toast.makeText(this, "Successfully Registered!", Toast.LENGTH_LONG); 
        ImageView Registerimage= (ImageView)findViewById(R.id.RegisterPicture); 
        Registerimage.setImageURI(registeryFileUri); 
        //} 
         } 
         else 
         Toast.makeText(this, "Not Registered!", Toast.LENGTH_LONG); 
      } 
**"android.permission.CAMERA"**  

Check whether the above permission is specified in your manifest or not 

Note: It's better to use getExternalCacheDir() than getFilesDir() if you still dont get the 
     image then use that. Dont forgot to specify the permission "android.permission.WRITE_EXTERNAL_STORAGE" if you use the getExternalCacheDir(). 
+0

Bạn quên gọi 'Toast.show(); 'bên trong' onActivityResult();' –

+0

ya, bạn đúng. Nhưng vấn đề là với ý định vì vậy tôi đã không xác minh mã còn lại. –

+0

Không hoạt động. Tôi đang sử dụng 4.0, vẫn không thể quay lại từ hoạt động của máy ảnh. – James

1

Trên một số thiết bị data sẽ không may được null trong onActivityResult sau khi gọi hoạt động camera. Vì vậy, bạn có thể cần phải lưu trạng thái của bạn trong các biến của hoạt động của bạn, và họ đọc chúng trong onActivityResult. Hãy nhớ lưu các biến này trong onSaveInstanceState và khôi phục chúng trong onCreate.

+1

Ngay cả khi "dữ liệu! = Null" không được thêm vào, tôi vẫn bị kẹt trong hoạt động của máy ảnh ... – James

7

Tôi mất một lúc để làm cho nó hoạt động và tôi đã thực hiện một số điều và cuối cùng nó hoạt động. Tôi không thể chắc chắn rằng những điều tôi đã làm là giải pháp cho vấn đề, nhưng tất cả chúng cùng tạo thành giải pháp làm việc.

Có nhiều lý do khiến hoạt động của máy ảnh không trả lại. Hai người chính là:

  1. đường dẫn cho các bức tranh mới là không hợp lệ, hoặc không tồn tại, hoặc nó không thể được tạo

  2. ứng dụng đã bị đình chỉ và lưu con đường bị lạc.

Vì vậy, đây là mã của tôi giải quyết tất cả những vấn đề này, tất cả cùng nhau làm việc.

Trước tiên tôi tạo ra lớp helper ImageServices:

class ImageServices { 

    private static String getTempDirectoryPath(Context ctx) { 
    File cache; 

    // SD Card Mounted 
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 
     cache = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + 
       "/Android/data/" + ctx.getPackageName() + "/cache/"); 
    } 
    // Use internal storage 
    else { 
     cache = ctx.getCacheDir(); 
    } 

    // Create the cache directory if it doesn't exist 
    if (!cache.exists()) { 
     cache.mkdirs(); 
    } 

    return cache.getAbsolutePath(); 
    } 

    public static Uri getOutputImageFileUri(Context ctx) { 
    // TODO: check the presence of SDCard 

    String tstamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File file = new File(getTempDirectoryPath(ctx), "IMG_" + tstamp + ".jpg"); 

    return Uri.fromFile(file); 

    } 
} 

Mã này được lấy cảm hứng từ một phần bởi developer.android.com và một phần bởi CameraLauncher class của dự án Apache Cordova.

Trong hoạt động của tôi xử lý sự kiện cho nút để chụp một bức ảnh trông như thế này:

private Uri imageFileUri; 

private static final int MAKE_PHOTO_RESULT_CODE = 100; 
private static final int PICK_PHOTO_RESULT_CODE = 101; 

public void onMakePhoto(View v) { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    imageFileUri = ImageServices.getOutputImageFileUri(this); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageFileUri); 
    Log.i("babies", "Taking picture: requested " + imageFileUri); 
    startActivityForResult(intent, MAKE_PHOTO_RESULT_CODE); 
} 

Phương pháp onActivityResult không thực sự chứa nhiều, như imageFileUri đã chỉ vào tập tin hiện hành và dựng hình cần thiết được thực hiện trong onResume phương pháp, được gọi là khi hoạt động sẽ trở lại vào foreground:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 
    switch(requestCode) { 
     case MAKE_PHOTO_RESULT_CODE: 
     assert imageFileUri != null; 
     break; 
     case ... 
     ...other cases... 
     break; 
    } 
    } 
} 

Nhưng điều này vẫn là chưa đủ, như imageFileUri bị mất như ứng dụng của bạn bị treo. Và trên thiết bị thông thường, cơ hội gần 100%.Vì vậy, tiếp theo bạn cần để lưu trữ các giá trị của imageFileUri trạng thái dụ:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    if (imageFileUri == null) { 
    outState.putString("file-uri", ""); 
    } 
    else { 
    outState.putString("file-uri", imageFileUri.toString()); 
    } 
}; 

và tải nó một lần nữa trong - dễ nhất là trực tiếp trong onCreate:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    if (savedInstanceState != null) { 
    String fileUri = savedInstanceState.getString("file-uri"); 
    if (!fileUri.equals("")) imageFileUri = Uri.parse(fileUri); 
    } 
} 

Vì vậy, một lần nữa, trên đầu trang của nhiều giải pháp khác được trình bày trên trang web này cũng như ở những nơi khác, có hai sự khác biệt lớn:

  1. thông minh hơn getTempDirectoryPath lấy cảm hứng từ Apache Cordova
  2. cho phép imageFileUri để tồn tại ứng dụng bị tạm ngưng

Và bây giờ - ít nhất là cho tôi - mọi thứ đều hoạt động tốt.

+0

Tôi đã kéo tóc ra cả ngày. Cuối cùng tìm thấy giải pháp này. Không có khả năng bạn sẽ thấy nhận xét này, nhưng nếu có, bạn có thấy bất kỳ thiết bị nào không hoạt động không? Great Stuff @Tom Burger –

+0

Ứng dụng chưa được sản xuất, vì vậy tôi không có nhiều thiết bị để kiểm tra điều này. Nhưng nếu bạn gặp thiết bị, nơi điều trên có thể là một vấn đề, hãy cho tôi biết chắc chắn :-) –

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