web-dev-qa-db-ja.com

カメラやギャラリーからの写真?

ギャラリーまたはカメラから次のように画像を選択できるインテントチューザーがあります。

    Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT,null);
    galleryIntent.setType("image/*");
    galleryIntent.addCategory(Intent.CATEGORY_OPENABLE);

    Intent cameraIntent = new Intent(Android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 


    Intent chooser = new Intent(Intent.ACTION_CHOOSER);
    chooser.putExtra(Intent.EXTRA_INTENT, galleryIntent);      
    chooser.putExtra(Intent.EXTRA_TITLE, "title");

    Intent[] intentArray =  {cameraIntent}; 
    chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
    startActivityForResult(chooser,REQUEST_CODE);

onActivityResultメソッドを次のようにしたい:

protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if(Condition == picture_coming_from_gallery)
    {
     //my code here
    }
    else if(condition == picture_coming_from_camera)
    {
     //another code here
    }
}

私の画像がどのソースから来ているのかを知ることができる条件は何ですか?

更新:

今それは働いています、そしてここに解決策があります:

    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{
    if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK)
    {
        if(data.getData()!=null)
        {
            try 
            {
            if (bitmap != null) 
                {
                    bitmap.recycle();
                }

            InputStream stream = getContentResolver().openInputStream(data.getData());
            bitmap = BitmapFactory.decodeStream(stream);
            stream.close();
            imageView.setImageBitmap(bitmap);
            }

        catch (FileNotFoundException e) 
            {
                e.printStackTrace();
            }

        catch (IOException e) 
            {
                e.printStackTrace();
            }
        } 

        else 
        {
            bitmap=(Bitmap) data.getExtras().get("data"); 
            imageView.setImageBitmap(bitmap);
        }

        super.onActivityResult(requestCode, resultCode, data);
    }
}

助けてくれてありがとう!

16
Hossam Oukli

現在のコードは、選択できるオプションを提示するための適切な方法ですが、管理が非常に難しいことがわかりました。少なくとも私のユースケースではそうでした。 Aviary SDKでさらに処理するために、カメラから取得した画像を保存する必要があります(ユーザーが選択した場合()。

そのために、回避策を提案したいと思います。

これはあなたの質問自体には対応していません。しかし、画像がどこから来ているのかを知る必要があることを考慮して、代替案を提供します(カメラ/ギャラリー)

AlertDialog.Builder builder = new AlertDialog.Builder(StatusUpdate.this);
builder.setTitle("Choose Image Source");
builder.setItems(new CharSequence[] {"Gallery", "Camera"}, 
        new DialogInterface.OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
        switch (which) {
        case 0:

            // GET IMAGE FROM THE GALLERY
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("image/*");

            Intent chooser = Intent.createChooser(intent, "Choose a Picture");
            startActivityForResult(chooser, ACTION_REQUEST_GALLERY);

            break;

        case 1:
            Intent getCameraImage = new Intent("Android.media.action.IMAGE_CAPTURE");

            File cameraFolder;

            if (Android.os.Environment.getExternalStorageState().equals
                    (Android.os.Environment.MEDIA_MOUNTED))
                cameraFolder = new File(Android.os.Environment.getExternalStorageDirectory(),
                        "some_directory_to_save_images/");
            else
                cameraFolder= StatusUpdate.this.getCacheDir();
            if(!cameraFolder.exists())
                cameraFolder.mkdirs();

            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
            String timeStamp = dateFormat.format(new Date());
            String imageFileName = "picture_" + timeStamp + ".jpg";

            File photo = new File(Environment.getExternalStorageDirectory(), 
                    "some_directory_to_save_images/" + imageFileName);
            getCameraImage.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
            initialURI = Uri.fromFile(photo);

            startActivityForResult(getCameraImage, ACTION_REQUEST_CAMERA);

            break;

        default:
            break;
        }
    }
});

builder.show();

これは結果です(私はあなたのコードがはるかに優れた選択セットを提供することをまだ維持していますが、繰り返しになりますが、あなたのユースケースや私のどちらかで最も簡単なことではありません):

enter image description here

これで、選択のソースに基づいて結果を処理できます。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK)    {

        switch (requestCode) {
        case ACTION_REQUEST_GALLERY:

            break;

        case ACTION_REQUEST_CAMERA:

            break;          
        }

    }
};

更新:

それを見つけた!! SOに関する回答はこちら 必要なものに正確に対応します。それはまだ*ある種の回避策*です。異なるrequestCodesに依存しないという意味で。しかし、それでも機能します。

不思議なことに、これで行き詰まったときに見逃しました。 :-(

注:ここにコードを投稿せず、代わりにリンクしています。すべての小道具は元の作者に行きます。 :-)

12
Siddharth Lele

REQUEST_CODEを使用して区別できます

    private static final int PICK_FROM_CAMERA = 1;
        private static final int PICK_FROM_GALLARY = 2;

        /* For Image capture from camera */
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, PICK_FROM_CAMERA);   

    /* For Image capture from Gallary*/             
        startActivityForResult(new Intent(Intent.ACTION_PICK,Android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI),
                                        PICK_FROM_GALLARY);
                        }



public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);

        switch (requestCode) {
               case PICK_FROM_CAMERA:
            if (resultCode == Activity.RESULT_OK) {
             Bitmap bitmapImage = (Bitmap) intent.getExtras().get("data");
              }
              break;

                case PICK_FROM_GALLARY:
               if (resultCode == Activity.RESULT_OK) {
              Uri mImageCaptureUri = intent.getData();
               }
             break;
         }
}
3
Amit Gupta