마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 비트맵 이미지, 데이터 인텐트 값 안넘어감

0 추천

메인화면에서 사진촬영 버튼을 누르면 바로 휴대폰 카메라로 연결되고, 촬영된 사진에서 색상을 뽑아서 비트맵 이미지와 색상명, rgb 값을 새로운 xml 파일에 보이도록 하는 코드인데 촬영, 페이지 이동은 되는데 촬영한 사진에서 색상 이미지 비트맵, 색상명 결과값이 하나도 넘어오지 않아요  에러메시지는 없는데 어디서 잘못한건지 모르겠습니다

<MainActivity>

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn_camera = (Button) findViewById(R.id.btn_camera);
        btn_camera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               dispatchTakePictureIntent();
            }
        });
    }
    public void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivity(takePictureIntent);
        // Ensure that there's a camera activity to handle the intent
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            // Create the File where the photo should go
            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException ex) {
                // Error occurred while creating the File
            }
            // Continue onlyif the File was successfully created
            if (photoFile != null) {
                Uri photoURI = FileProvider.getUriForFile(this,
                         "패키지명",
                        photoFile);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
            }
        }
    }
    private File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        //String timeStamp = DateFormat.getDateTimeInstance().format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_" ;
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,
                ".jpg", 
                storageDir  
        );
        // Save a file: path for use with ACTION_VIEW intents
        mCurrentPhotoPath = image.getAbsolutePath();
        Intent intent = new Intent(getApplicationContext(), RecognitionDetail.class);
        intent.putExtra(EXTRA_MESSAGE,mCurrentPhotoPath);
        startActivity(intent);
        return image;
    }
}
<CameraActivity>
public class CameraActivity extends AppCompatActivity {
    Intent intent = getIntent();
    String mCurrentPhotoPath = intent.getStringExtra(EXTRA_MESSAGE);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recognition_detail);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        try{
            switch (requestCode) {
                case REQUEST_TAKE_PHOTO: {
                    if (resultCode == RESULT_OK) {
                        Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath);
                        int mRGB = bitmap.getPixel((bitmap.getWidth() / 2), (bitmap.getHeight() / 2));
                        // Color Conversions
                        float[] mHSV = new float[3];
                        colorToHSV(mRGB, mHSV);
                        float[] mRGBArray = RGBIntToArray(mRGB);

                        // Setting Displays
                        setColorDisplay(mRGB);
                        setRGBText(mRGB);
                        //setHSVText(mHSV);

                        // closest color
                        findClosestColor(mRGBArray);
                    }
                    break;
                }
            }
        } catch (Exception error) { error.printStackTrace();}
    }
    private void setColorDisplay(int mRGB) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        Bitmap mBlock = Bitmap.createBitmap(displayMetrics.widthPixels, 250, Bitmap.Config.ARGB_8888);

        mBlock.eraseColor(mRGB);

        ImageView iv_detail = findViewById(R.id.iv_detail);
        iv_detail.setImageBitmap(mBlock);

        Intent intent = new Intent(getApplicationContext(), RecognitionDetail.class);

        intent.putExtra("colorimg", mBlock);
        startActivity(intent);
    }
    private void setRGBText(int mRGB) {
        int r = (mRGB >> 16) & 0xff;
        int g = (mRGB >> 8) & 0xff;
        int b = mRGB & 0xff;

        String mRGBString = "R " + r + "\nG " + g + "\nB " + b;
        Intent intent = new Intent(getApplicationContext(), RecognitionDetail.class);
        intent.putExtra("rgb",mRGBString);
        startActivity(intent);
    }
    // Closest Color
    private void findClosestColor(float[] mRGBArray) {
        float distance = Float.MAX_VALUE;
        int closestIndex = 0;
        ColorSpace.Connector c = ColorSpace.connect(
                ColorSpace.get(ColorSpace.Named.SRGB),
                ColorSpace.get(ColorSpace.Named.CIE_LAB));
        float[] mCIELab = c.transform(mRGBArray);
        for (int i = 0; i < ColorSets.X11Colors.length; i++) {
            float[] X11CIELab = c.transform(RGBIntToArray(ColorSets.X11Colors[i].ColorRGB));
            float tryDistance = findCIELabDist(mCIELab, X11CIELab);
            if (tryDistance < distance) {
                distance = tryDistance;
                closestIndex = i;
            }
        }
        TextView tv_colorname = findViewById(R.id.tv_colorname);
        tv_colorname.setText(ColorSets.X11Colors[closestIndex].ColorName);

        setClosestColorRGB(ColorSets.X11Colors[closestIndex].ColorRGB);
        setClosestColorDisplay(ColorSets.X11Colors[closestIndex].ColorRGB);

        Intent intent = new Intent(getApplicationContext(), RecognitionDetail.class);
        intent.putExtra("colorname",ColorSets.X11Colors[closestIndex].ColorName);
        startActivity(intent);
    }
}
<recognitiondetail>
public class RecognitionDetail extends AppCompatActivity {
    ImageView iv_detail;
    TextView tv_colorname,tv_coloreng, tv_colordetail;

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

        iv_detail = findViewById(R.id.iv_detail);
        tv_colordetail = findViewById(R.id.tv_colordetail);
        tv_coloreng = findViewById(R.id.tv_coloreng);
        tv_colorname = findViewById(R.id.tv_colorname);

        Intent intent = getIntent();

        //String mCurrentPhotoPath = intent.getStringExtra(EXTRA_MESSAGE);
       // Bitmap bm = BitmapFactory.decodeFile(mCurrentPhotoPath);
        Bitmap bm = (Bitmap)intent.getParcelableExtra("colorimg");
        iv_detail.setImageBitmap(bm);

        String colorgrb= intent.getStringExtra("rgb");
        tv_colordetail.setText(colorgrb);
        String colorname= intent.getStringExtra("colorname");
        tv_colorname.setText(colorname);
    }
}
am9911 (160 포인트) 님이 2020년 10월 17일 질문

1개의 답변

0 추천
궁금한게 있는데, 왜 카메라를 MainActivity에서 띄우는데, 결과는 CameraActivity에서 받고 있나요?
spark (226,420 포인트) 님이 2020년 10월 17일 답변
MainActivity에 여러 버튼 실행이 있는데 그 중 하나가 색상인식카메라 버튼 실행이라 메인에서 버튼을 누르면 CameraActivity로 이동해서 촬영 후, 결과값을 또 다른 화면에서 출력하기를 원해서 결과는 CameraActivity에서 받고 있습니다!
그럼, MainActivity에서 CameraActivity를 띄우는 부분이 안보이는데요. btn_camera는 그냥 카메라를 띄우는 코드인데, 혹시 CameraActivity에 IntentFilter가 설정되어 있나요? 코드가 연결이 안되네요. 촬영결과를 받는 Activity가 CameraActivity인데 여기에는 Camera을 호출하는 코드가 없거든요. MainActivity에서 dispatchTakePictureIntent로 카메라를 호출했으면 결과도 MainActivity의 onActivityResult에서 받아야 하는 거 아닌가 해서요.
그래서 원래는 MainActivity와 CameraActiviy를 합쳤는데 그렇게 하면 RecognitionDetail로 화면이동을 안해서 일부러 두개로 나눴습니다ㅠㅠㅠ 촬영한 이미지까지는 RecognitionDetail 화면에 나오는데 색상명이 안나오네요..
...