簡體   English   中英

在Android中使用MediaStore.ACTION_IMAGE_CAPTURE意圖捕獲圖像

[英]capturing images with MediaStore.ACTION_IMAGE_CAPTURE intent in android

我正在使用MediaStore.ACTION_IMAGE_CAPTURE意圖捕獲圖像。 它在大多數設備上運行良好。 但它在一些最新的Android設備中無法正常工作。

我的意圖是使用相機捕獲圖像並將其發送到服務器,但不將該圖像存儲在設備的默認庫中。

* * :當我捕獲圖像時,它會在onActivityResult方法中返回一些其他圖庫圖像,而不是在某些最新的Android設備中捕獲圖像。 我使用下面的代碼來捕獲和存儲圖像。

public void launchCamera(View v) {
    Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(camera, CAMERA_PIC_REQUEST );
}

在onActivityResult方法中,

String[] projection = { MediaStore.Images.ImageColumns.SIZE,
                    MediaStore.Images.ImageColumns.DISPLAY_NAME,
                    MediaStore.Images.ImageColumns.DATA, BaseColumns._ID, };
            Cursor c = null;
            Uri u = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            try {
                if (u != null) {
                    c = managedQuery(u, projection, null, null, null);
                }
                if ((c != null) && (c.moveToLast())) {
                    Bitmap thumbnail = getBitMapFromLocalPath(c.getString(2), 3);
                    idsImagesgot.add(thumbnail);
                    ContentResolver cr = getContentResolver();
                    cr.delete( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                            BaseColumns._ID + "=" + c.getString(3), null);
                }
            } finally {
                if (c != null) {
                    c.close();
                }
            }

任何人都可以在這方面幫助我。

提前致謝。

Sathish所在

ACTION_IMAGE_CAPTURE拍攝的照片未在所有設備上自動在MediaStore中注冊。

官方Android指南提供了這個示例: http//developer.android.com/guide/topics/media/camera.html#intent-receive但是這在所有設備上都不起作用。

我所知道的唯一可靠方法是在局部變量中保存圖片的路徑。 請注意,您的應用程序可能在后台(在相機應用程序運行時)被殺死,因此您必須在onSaveInstanceState期間保存路徑。

評論后編輯:

創建臨時文件名,在啟動意圖時將存儲照片。

File tempFile = File.createTempFile("my_app", ".jpg");
fileName = tempFile.getAbsolutePath();
Uri uri = Uri.fromFile(tempFile);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, PICTURE_REQUEST_CODE);

fileName是一個String,是您活動的一個字段。 你必須這樣保存:

@Override
public void onSaveInstanceState(Bundle bundle)
{
 super.onSaveInstanceState(bundle);
 bundle.putString("fileName", fileName);
}

並在onCreate()中恢復它:

public void onCreate(Bundle savedInstanceState)
{
 if (savedInstanceState != null)
  fileName = savedInstanceState.getString("fileName");
 // ...
}

現在,在onActivityResult時,您知道存儲照片的文件的名稱( fileName )。 您可以使用它執行任何操作,然后將其刪除。

2013-09-19編輯:似乎有些相機應用忽略了putExtra uri,並將圖片存儲在不同的地方。 因此,在使用fileName的值之前,您應該檢查intent是否為null。 如果獲得非null意圖,那么您應該首選intent.getData()不是fileName 僅在需要時才使用fileName作為備份解決方案。

我的onActivityResult()方法看起來像這樣,它可以從MediaStore.ACTION_IMAGE_CAPTURE獲取圖像:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap mImageBitmap = (Bitmap) extras.get("data");
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM