从android中的相机意图获取uri

use*_*104 9 camera android android-intent

点击

 takePic.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                Intent m_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                imageUri = getImageUri();
                m_intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(m_intent, REQUEST_IMAGE_CAPTURE);
            }
        });
Run Code Online (Sandbox Code Playgroud)

结果:

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_IMAGE_CAPTURE
                    && resultCode == RESULT_OK) {   

                Log.d("test1",""+imageUri);
                Intent shareIntent = new Intent(this, SharePicForm.class);
                shareIntent.putExtra("photo",""+imageUri);
                startActivity(shareIntent);
            }

        }
Run Code Online (Sandbox Code Playgroud)

getImageUri()

private Uri getImageUri(){
        Uri m_imgUri = null;
        File m_file;
        try {
            SimpleDateFormat m_sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
            m_curentDateandTime = m_sdf.format(new Date());
            m_imagePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + m_curentDateandTime + ".jpg";
            m_file = new File(m_imagePath);
            m_imgUri = Uri.fromFile(m_file);
        } catch (Exception p_e) {
        }
        return m_imgUri;
    }
Run Code Online (Sandbox Code Playgroud)

我想要实现的是非常简单,调用相机意图并获得结果照片的uri.但似乎不同的设备不一致,在我的设备上它根本不起作用.我试图将路径存储在公共变量上但是当我检索它时,它是null,是否有正式和标准的方法来实现它并且应该在所有设备上工作?另外,有没有办法不提供自定义路径,但从相机意图获取默认的uri路径?

谢谢你的帮助

Ale*_*ohn 10

如果您的设备不尊重cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,您仍然可以使用

Uri imageUri = data.getData();
Run Code Online (Sandbox Code Playgroud)

onActivityResult(int requestCode, int resultCode, Intent data).但在大多数情况下,问题在于RAM是有限的,系统会破坏您的活动,为相机应用程序提供足够的内存以实现您的意图.因此,当返回结果时,您的活动字段不会被初始化,您应该遵循Amit的建议并实施onSavedInstance()onRestoreInstanceState().

  • data.getData 在大多数情况下返回 null (2认同)
  • 即使我没有按照我的意图传递 MediaStore.EXTRA_OUTPUT,data.getData() 在我的设备(android 7.1.1)上返回 null。`意图意图=新意图(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(意图,CAMERA_REQUEST_CODE);` (2认同)

uma*_*air 6

首先确保您的目录已创建......

final String dir =  Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+ "/Folder/";
     File newdir = new File(dir); 
     newdir.mkdirs();
Run Code Online (Sandbox Code Playgroud)

在按钮上单击调用此函数。

private void capturarFoto() {
 String file = dir+DateFormat.format("yyyy-MM-dd_hhmmss", new Date()).toString()+".jpg";


File newfile = new File(file);
            try {
                newfile.createNewFile();
            } catch (IOException e) {}       

            Uri outputFileUri = Uri.fromFile(newfile);

            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

            startActivityForResult(cameraIntent, TAKE_PHOTO_CODE);
}

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

    if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) {
        Log.d("Demo Pic", "Picture is saved");


    }
}
Run Code Online (Sandbox Code Playgroud)

确保您在清单中添加权限

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

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Run Code Online (Sandbox Code Playgroud)

  • 如果通过隐式 Intent 使用相机,则不需要相机权限。仅当您实现自己的相机时才需要它 (2认同)
  • data 在 this 中返回 null。我感到很困惑 (2认同)