web-dev-qa-db-ja.com

android)のカメラインテントからURIを取得します

クリックすると

 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);
            }
        });

結果について:

 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);
            }

        }

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;
    }

私が達成したいのは非常に単純です。カメラインテントを呼び出して、結果の写真のURIを取得します。しかし、異なるデバイスの一貫性がないようで、私のデバイスではまったく機能しません。パスをパブリック変数に格納しようとしましたが、取得するとnullになります。これを実装するための正式で標準的な方法はあり、すべてのデバイスで機能するはずですか?また、カスタムパスを提供せずに、カメラインテントからデフォルトのURIパスを取得する方法はありますか?

助けてくれてありがとう

9
user782104

デバイスが_cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT_を尊重しない場合でも、

_Uri imageUri = data.getData();
_

onActivityResult(int requestCode, int resultCode, Intent data)で。しかし、ほとんどの場合、問題はRAMが制限されており、システムがアクティビティを破棄して、カメラアプリに十分なメモリを与えて、意図を実現することです。したがって、結果が返されると、アクティビティのフィールドは初期化されていないため、 Amit の提案に従い、onSavedInstance()およびonRestoreInstanceState()を実装する必要があります。

10
Alex Cohn

まず、ディレクトリが作成されていることを確認してください......

final String dir =  Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)+ "/Folder/";
     File newdir = new File(dir); 
     newdir.mkdirs();

ボタンをクリックすると、この関数を呼び出します。

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");


    }
}

マニフェストに権限を追加してください

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

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
4
umair