Máy ảnh Android: mục đích dữ liệu trả về null


132

Tôi có một ứng dụng Android chứa nhiều hoạt động.

Một trong số đó tôi đang sử dụng một nút sẽ gọi camera của thiết bị:

public void onClick(View view) {
    Intent photoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(photoIntent, IMAGE_CAPTURE);
}

Trong cùng một hoạt động tôi gọi OnActivityResultphương thức cho kết quả hình ảnh:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == IMAGE_CAPTURE) {
        if (resultCode == RESULT_OK) {
            Bitmap image = (Bitmap) data.getExtras().get("data");
            ImageView imageview = (ImageView) findViewById(R.id.pic);
            imageview.setImageBitmap(image);
        } else if (resultCode == RESULT_CANCELED) {
            Toast.makeText(this, "CANCELED ", Toast.LENGTH_LONG).show();
        }
    }
}

Vấn đề là ý định datalà null và OnActivityResultphương thức chuyển trực tiếp sang (resultCode == RESULT_CANCELED)và ứng dụng trở về trạng thái trước đó.

Làm cách nào để khắc phục sự cố này và sau khi gọi camera, ứng dụng sẽ quay trở lại hoạt động hiện tại ImageViewcó chứa ảnh sẽ chụp?

Cảm ơn


có một cái nhìn về câu trả lời này stackoverflow.com/questions/18120775/ từ
Praveen Sharma

Câu trả lời:


218

Ứng dụng máy ảnh Android mặc định chỉ trả về mục đích không null khi trả lại hình thu nhỏ trong Mục đích được trả về. Nếu bạn chuyển EXTRA_OUTPUTvới một URI để ghi vào, nó sẽ trả về một nullý định và hình ảnh nằm trong URI mà bạn đã truyền vào.

Bạn có thể xác minh điều này bằng cách xem mã nguồn của ứng dụng máy ảnh trên GitHub:

Tôi đoán rằng bạn đang truy cập EXTRA_OUTPUTbằng cách nào đó hoặc ứng dụng camera trên điện thoại của bạn hoạt động khác đi.


12
Làm cách nào để khắc phục chức năng đặt thêm, mang lại ý định không có giá trị trong máy ảnh trênActivityResult
Abdul Wahab

Câu trả lời thực sự hữu ích Tôi ước tôi có thể chấp nhận nó cho người khác để tìm ra giải pháp hiệu quả hơn.
user1160020

1
Tuyệt vời ! Cảm ơn rất nhiều vì đã giải thích :) +100
Muhammad Riyaz

Liên kết bạn đã đăng, không còn hợp lệ.

4
Chúng ta có thể sử dụng lớp máy ảnh và chỉ thay đổi một phương thức đó để cho phép cả hai, hoặc khó hơn không?
Tanner Summers

16

Tôi tìm thấy một câu trả lời dễ dàng. nó hoạt động !!

private void openCameraForResult(int requestCode){
    Intent photo = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    Uri uri  = Uri.parse("file:///sdcard/photo.jpg");
    photo.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uri);
    startActivityForResult(photo,requestCode);
}

if (requestCode == CAMERA_REQUEST_CODE) {
        if (resultCode == Activity.RESULT_OK) {
            File file = new File(Environment.getExternalStorageDirectory().getPath(), "photo.jpg");
            Uri uri = Uri.fromFile(file);
            Bitmap bitmap;
            try {
                bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                bitmap = cropAndScale(bitmap, 300); // if you mind scaling
                profileImageView.setImageBitmap(bitmap);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

nếu bạn muốn cắt và chia tỷ lệ hình ảnh này

public static  Bitmap cropAndScale (Bitmap source, int scale){
    int factor = source.getHeight() <= source.getWidth() ? source.getHeight(): source.getWidth();
    int longer = source.getHeight() >= source.getWidth() ? source.getHeight(): source.getWidth();
    int x = source.getHeight() >= source.getWidth() ?0:(longer-factor)/2;
    int y = source.getHeight() <= source.getWidth() ?0:(longer-factor)/2;
    source = Bitmap.createBitmap(source, x, y, factor, factor);
    source = Bitmap.createScaledBitmap(source, scale, scale, false);
    return source;
}

4
Nó cung cấp một FileUriExposedExceptionphiên bản SDK hiện đại.
Souradeep Nanda

8

Tôi đã trải qua vấn đề này, intentkhông phải là null nhưng thông tin được gửi qua đây intentkhông được nhận trongonActionActivit()

nhập mô tả hình ảnh ở đây

Đây là một giải pháp tốt hơn bằng cách sử dụng getContentResolver () :

    private Uri imageUri;
    private ImageView myImageView;
    private Bitmap thumbnail;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

      ...
      ...    
      ...
      myImageview = (ImageView) findViewById(R.id.pic); 

      values = new ContentValues();
      values.put(MediaStore.Images.Media.TITLE, "MyPicture");
      values.put(MediaStore.Images.Media.DESCRIPTION, "Photo taken on " + System.currentTimeMillis());
      imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
      startActivityForResult(intent, PICTURE_RESULT);

  }

những onActivityResult()có được một bitmap lưu trữ bởi getContentResolver () :

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

        if (requestCode == REQUEST_CODE_TAKE_PHOTO && resultCode == RESULT_OK) {

            Bitmap bitmap;
            try {
                bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
                myImageView.setImageBitmap(bitmap);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

giới thiệu la descripción de la fanten aquí giới thiệu la descripción de la fanten aquí

Kiểm tra ví dụ của tôi trong github:

https://github.com/Jorgesys/TakePicture


6

Ứng dụng máy ảnh làm việc đơn giản tránh vấn đề mục đích null

- tất cả các mã thay đổi được bao gồm trong trả lời này; gần với hướng dẫn Android

Tôi đã dành nhiều thời gian cho vấn đề này, vì vậy tôi quyết định tạo một tài khoản và chia sẻ kết quả của mình với bạn.

Hướng dẫn chính thức dành cho Android "Chụp ảnh đơn giản" hóa ra không hoàn toàn giữ đúng những gì nó đã hứa. Mã được cung cấp ở đó không hoạt động trên thiết bị của tôi: Samsung Galaxy S4 Mini GT-I9195 chạy phiên bản Android 4.4.2 / KitKat / API Cấp 19.

Tôi đã tìm ra rằng vấn đề chính là dòng sau trong phương thức được gọi khi chụp ảnh ( dispatchTakePictureIntenttrong hướng dẫn):

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);

Nó dẫn đến ý định sau đó bị bắt bởi onActivityResultnull.

Để giải quyết vấn đề này, tôi đã lấy nhiều cảm hứng từ các câu trả lời trước đây ở đây và một số bài viết hữu ích trên github (chủ yếu là bài này của deepwinter - rất cảm ơn anh ấy; bạn có thể muốn xem câu trả lời của anh ấy trên một bài đăng liên quan chặt chẽ ).

Theo những lời khuyên thú vị này, tôi đã chọn chiến lược xóa putExtradòng đã đề cập và thực hiện điều tương ứng là lấy lại ảnh đã chụp từ máy ảnh trong phương thức onActivityResult (). Các dòng mã quyết định để lấy lại bitmap được liên kết với hình ảnh là:

        Uri uri = intent.getData();
        Bitmap bitmap = null;
        try {
            bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
        } catch (IOException e) {
            e.printStackTrace();
        }

Tôi đã tạo ra một ứng dụng mẫu mực có khả năng chụp ảnh, lưu nó vào thẻ SD và hiển thị nó. Tôi nghĩ rằng điều này có thể hữu ích cho những người có cùng hoàn cảnh như tôi khi tôi vấp phải vấn đề này, vì các đề xuất trợ giúp hiện tại chủ yếu đề cập đến các bài đăng github khá rộng rãi làm vấn đề nhưng không quá dễ dàng để giám sát những người mới như tôi. Đối với hệ thống tệp mà Android Studio tạo theo mặc định khi tạo dự án mới, tôi chỉ phải thay đổi ba tệp cho mục đích của mình:

Activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.android.simpleworkingcameraapp.MainActivity">

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="takePicAndDisplayIt"
    android:text="Take a pic and display it." />

<ImageView
    android:id="@+id/image1"
    android:layout_width="match_parent"
    android:layout_height="200dp" />

</LinearLayout>

MainActivity.java:

package com.example.android.simpleworkingcameraapp;

import android.content.Intent;
import android.graphics.Bitmap;
import android.media.Image;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

private ImageView image;
static final int REQUEST_TAKE_PHOTO = 1;
String mCurrentPhotoPath;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    image = (ImageView) findViewById(R.id.image1);
}

// copied from the android development pages; just added a Toast to show the storage location
private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmm").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );

    // Save a file: path for use with ACTION_VIEW intents
    mCurrentPhotoPath = image.getAbsolutePath();
    Toast.makeText(this, mCurrentPhotoPath, Toast.LENGTH_LONG).show();
    return image;
}

public void takePicAndDisplayIt(View view) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (intent.resolveActivity(getPackageManager()) != null) {
        File file = null;
        try {
            file = createImageFile();
        } catch (IOException ex) {
            // Error occurred while creating the File
        }

        startActivityForResult(intent, REQUEST_TAKE_PHOTO);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultcode, Intent intent) {
    if (requestCode == REQUEST_TAKE_PHOTO && resultcode == RESULT_OK) {
        Uri uri = intent.getData();
        Bitmap bitmap = null;
        try {
            bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
        } catch (IOException e) {
            e.printStackTrace();
        }
        image.setImageBitmap(bitmap);
    }
}
}

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.simpleworkingcameraapp">


<!--only added paragraph-->
<uses-feature
    android:name="android.hardware.camera"
    android:required="true" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  <!-- only crucial line to add; for me it still worked without the other lines in this paragraph -->
<uses-permission android:name="android.permission.CAMERA" />


<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

Lưu ý rằng giải pháp tôi tìm thấy cho vấn đề cũng dẫn đến việc đơn giản hóa tệp kê khai Android: những thay đổi được đề xuất bởi hướng dẫn Android về việc thêm nhà cung cấp không còn cần thiết vì tôi không sử dụng bất kỳ mã java nào. Do đó, chỉ có một vài dòng tiêu chuẩn - chủ yếu liên quan đến quyền - phải được thêm vào tệp kê khai.

Ngoài ra, có thể có giá trị khi chỉ ra rằng tính năng tự động nhập của Android Studio có thể không có khả năng xử lý java.text.SimpleDateFormatjava.util.Date. Tôi đã phải nhập cả hai bằng tay.


giải pháp này đòi hỏi phải có sự cho phép BẢO QUẢN, đây không phải là cách tiếp cận tốt.
shanraisshan

4
Câu hỏi nêu rõ rằng tham số Intent có tên "data" được truyền vào onActivityResult () là null, trong khi giải pháp của bạn sẽ tiếp tục và cố gắng sử dụng nó.
Maks

2

Có lẽ bởi vì bạn đã có một cái gì đó như thế này?

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);                        
Uri fileUri =  CommonUtilities.getTBCameraOutputMediaFileUri();                  
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);                        
startActivityForResult(takePictureIntent, 2);

Tuy nhiên, bạn không được đặt đầu ra thêm vào mục đích, vì sau đó dữ liệu sẽ đi vào URI thay vì biến dữ liệu. Vì lý do đó, bạn phải lấy hai dòng ở giữa, để bạn có

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePictureIntent, 2);

Đó là những gì gây ra vấn đề cho tôi, hy vọng rằng đã giúp.


12
Câu trả lời này là sai lệch. Bạn sẽ nhận được hình thu nhỏ thay vì ảnh có kích thước đầy đủ mà không cần đặt MediaStore.EXTRA_OUTPUT. Nó được nhấn mạnh trong các tài liệu và trong các câu trả lời khác.
dùng2417480

2
Hoàn toàn là câu trả lời sai lệch này.
IndexOutOfDevelopersException 8/8/18

đây là một câu trả lời sai lệch
Abdulla Thanseeh

0

Đoạn mã sau hoạt động với tôi:

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, 2);

Và đây là kết quả:

protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent)
{ 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

    if(resultCode == RESULT_OK)
    {
        Uri selectedImage = imageReturnedIntent.getData();
        ImageView photo = (ImageView) findViewById(R.id.add_contact_label_photo);
        Bitmap mBitmap = null;
        try
        {
            mBitmap = Media.getBitmap(this.getContentResolver(), selectedImage);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

Tôi đã thử nghiệm nhưng vấn đề tương tự :(
soft_developer

1
tôi đang nhận được imageReturnedIntent.getData()giá trị null. Tôi đang tạo ra ý định giống như của bạn. Không đổ bất kỳ thông số bổ sung.
Jaydip Kalkani


0

Mã Kotlin hoạt động với tôi:

 private fun takePhotoFromCamera() {
          val intent = Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE)
        startActivityForResult(intent, PERMISSIONS_REQUEST_TAKE_PICTURE_CAMERA)
      }

Và nhận kết quả:

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
 if (requestCode == PERMISSIONS_REQUEST_TAKE_PICTURE_CAMERA) {
         if (resultCode == Activity.RESULT_OK) {
           val photo: Bitmap? =  MediaStore.Images.Media.getBitmap(this.contentResolver, Uri.parse( data!!.dataString)   )
            // Do something here : set image to an ImageView or save it ..   
              imgV_pic.imageBitmap = photo 
        } else if (resultCode == Activity.RESULT_CANCELED) {
            Log.i(TAG, "Camera  , RESULT_CANCELED ")
        }

    }

}

và đừng quên khai báo mã yêu cầu:

companion object {
 const val PERMISSIONS_REQUEST_TAKE_PICTURE_CAMERA = 300
  }

0

Sau nhiều cố gắng và nghiên cứu, tôi đã có thể tìm ra nó. Đầu tiên, dữ liệu biến từ Intent sẽ luôn là null, do đó, việc kiểm tra !nullsẽ làm hỏng ứng dụng của bạn quá lâu khi bạn chuyển URI sang startActivityForResult. Thực hiện theo ví dụ bên dưới. Tôi sẽ sử dụng Kotlin.

  1. Mở ý định camera

    fun addBathroomPhoto(){
    addbathroomphoto.setOnClickListener{
    
        request_capture_image=2
    
        var takePictureIntent:Intent?
        takePictureIntent =Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        if(takePictureIntent.resolveActivity(activity?.getPackageManager()) != null){
    
            val photoFile: File? = try {
                createImageFile()
            } catch (ex: IOException) {
                // Error occurred while creating the File
    
                null
            }
    
            if (photoFile != null) {
                val photoURI: Uri = FileProvider.getUriForFile(
                    activity!!,
                    "ogavenue.ng.hotelroomkeeping.fileprovider",photoFile)
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                    photoURI);
                startActivityForResult(takePictureIntent,
                    request_capture_image);
            }
    
    
        }
    
    }

    } `

  2. Tạo createImageFile (). Nhưng bạn PHẢI biến biến imageFilePath thành toàn cục. Ví dụ về cách tạo nó là trên tài liệu chính thức của Android và khá đơn giản

  3. Nhận ý định

     override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    
    if (requestCode == 1 && resultCode == RESULT_OK) {
        add_room_photo_txt.text=""
        var myBitmap=BitmapFactory.decodeFile(imageFilePath)
        addroomphoto.setImageBitmap(myBitmap)
        var file=File(imageFilePath)
        var fis=FileInputStream(file)
        var bm = BitmapFactory.decodeStream(fis);
        roomphoto=getBytesFromBitmap(bm) }}
  4. Phương thức getBytesFromBitmap

      fun getBytesFromBitmap(bitmap:Bitmap):ByteArray{
    
      var stream=ByteArrayOutputStream()
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
      return stream.toByteArray();
      }

Tôi hi vọng cái này giúp được.


0

Khi chúng tôi sẽ chụp ảnh từ Camera trong Android thì Uri hoặc data.getdata()null. chúng tôi có hai giải pháp để giải quyết vấn đề này.

  1. Chúng ta có thể có đường dẫn Uri từ Hình ảnh Bitmap
  2. Chúng ta có thể có đường dẫn Uri từ con trỏ.

Tôi sẽ thực hiện tất cả các phương pháp ở đây, Vui lòng xem kỹ và đọc những điều sau: -

Đầu tiên tôi sẽ nói cách lấy Uri từ Bitmap Image: Mã hoàn chỉnh là:

Đầu tiên chúng ta sẽ chụp ảnh thông qua Intent giống nhau cho cả hai phương thức, vì vậy mã này tôi sẽ chỉ viết một lần duy nhất tại đây:

// Capture Image
captureImg.setOnClickListener(new View.OnClickListener(){
    @Override public void onClick(View view){
        Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if(intent.resolveActivity(getPackageManager())!=null){
            startActivityForResult(intent,reqcode);
        }

    }
});  

Bây giờ chúng tôi sẽ triển khai OnActivityResult :-( Điều này sẽ giống nhau cho cả hai phương pháp trên): -

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

    if (requestCode == reqcode && resultCode == RESULT_OK)
    {

        Bitmap photo = (Bitmap) data.getExtras().get("data");
        ImageView.setImageBitmap(photo);

        // CALL THIS METHOD TO GET THE URI FROM THE BITMAP
        Uri tempUri = getImageUri(getApplicationContext(), photo);

        //Show Uri path based on Image
        Toast.makeText(LiveImage.this, "Here " + tempUri, Toast.LENGTH_LONG).show();

        //Show Uri path based on Cursor Content Resolver
        Toast.makeText(this, "Real path for URI : " + getRealPathFromURI(tempUri), Toast.LENGTH_SHORT).show();
    }
    else
    {
        Toast.makeText(this, "Failed To Capture Image", Toast.LENGTH_SHORT).show();
    }
}     

Bây giờ chúng ta sẽ tạo tất cả các phương thức trên để tạo Uri từ các phương thức Image và Coder thông qua các lớp:

Bây giờ đường dẫn URI từ Bitmap Image

private Uri getImageUri(Context applicationContext, Bitmap photo)
{
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    photo.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(LiveImage.this.getContentResolver(), photo, "Title", null);
    return Uri.parse(path);
}

\ Uri từ đường dẫn thực của hình ảnh đã lưu

public String getRealPathFromURI(Uri uri)
{
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    return cursor.getString(idx);
}

-1

Khi chúng tôi chụp ảnh từ Camera trong Android Urihoặc data.getdata()trở thành null. Chúng tôi có hai giải pháp để giải quyết vấn đề này.

  1. Lấy đường dẫn Uri từ Ảnh Bitmap
  2. Lấy đường dẫn Uri từ con trỏ.

Đây là cách lấy Uri từ Bitmap Image. Đầu tiên chụp ảnh thông qua Ý định sẽ giống nhau cho cả hai phương pháp:

// Capture Image
captureImg.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (intent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(intent, reqcode);
        }
    }
});

Bây giờ thực hiện OnActivityResult, sẽ giống nhau cho cả hai phương thức:

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

    if(requestCode==reqcode && resultCode==RESULT_OK)
    {
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        ImageView.setImageBitmap(photo);

        // CALL THIS METHOD TO GET THE URI FROM THE BITMAP
        Uri tempUri = getImageUri(getApplicationContext(), photo);

        // Show Uri path based on Image
        Toast.makeText(LiveImage.this,"Here "+ tempUri, Toast.LENGTH_LONG).show();

        // Show Uri path based on Cursor Content Resolver
        Toast.makeText(this, "Real path for URI : "+getRealPathFromURI(tempUri), Toast.LENGTH_SHORT).show();
    }
    else
    {
        Toast.makeText(this, "Failed To Capture Image", Toast.LENGTH_SHORT).show();
    }
}

Bây giờ tạo tất cả các phương thức trên để tạo Uri từ các phương thức Image và Coder:

Đường dẫn Uri từ Bitmap Image:

private Uri getImageUri(Context applicationContext, Bitmap photo) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    photo.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(LiveImage.this.getContentResolver(), photo, "Title", null);
    return Uri.parse(path);
}

Uri từ đường dẫn thực của hình ảnh đã lưu:

public String getRealPathFromURI(Uri uri) {
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    return cursor.getString(idx);
}

Có ai có thể giải quyết điều này? Vui lòng gửi giải pháp của bạn. Tài liệu Android rõ ràng đã không thể giải quyết điều này
Gstuntz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.