2017-12-21 54 views
0

저는 텍스트 인식 기능을 갖춘 OCR 응용 프로그램을 개발하려고합니다. 내가 작성하고 제대로 작동하는 몇 가지 코드를 발견했지만 내 문제는 내가 카메라 레이아웃에 몇 가지 사용자 정의를 만들고 싶어. 내 캡처 버튼을 추가하고 프레임을 추가하고 싶습니다. 나는 실제로 "표면보기/홀더"와 다른 프로젝트에서 그것을했습니다. 그러나 프로젝트가 다르게 작동하기 때문에 프로젝트를 구현할 수 없습니다.Android에서 맞춤 카메라 레이아웃을 만드는 방법은 무엇입니까?

public class MainActivity extends AppCompatActivity { 

private static final int REQUEST_GALLERY = 0; 
private static final int REQUEST_CAMERA = 1; 

private static final String TAG = MainActivity.class.getSimpleName(); 

private Uri imageUri; 
private TextView detectedTextView; // layouttaki text view 

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

    findViewById(R.id.choose_from_gallery).setOnClickListener(new View.OnClickListener() { // galeriden resim seçme işlemi 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(); 
      intent.setType("image/*"); 
      intent.setAction(Intent.ACTION_GET_CONTENT); 
      startActivityForResult(intent, REQUEST_GALLERY); 
     } 
    }); 

    findViewById(R.id.take_a_photo).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { // resim çekme işlemi 

      String filename = System.currentTimeMillis() + ".jpg"; 

      ContentValues values = new ContentValues(); 
      values.put(MediaStore.Images.Media.TITLE, filename); 
      values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); 
      imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 

      Intent intent = new Intent(); 
      intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 
      startActivityForResult(intent, REQUEST_CAMERA); 
     } 
    }); 

    detectedTextView = (TextView) findViewById(R.id.detected_text); 
    detectedTextView.setMovementMethod(new ScrollingMovementMethod()); 
} 

private void inspectFromBitmap(Bitmap bitmap) { //kendisine gelen bitmap resimden inspect yapar 


    TextRecognizer textRecognizer = new TextRecognizer.Builder(this).build(); 
    try { 
     if (!textRecognizer.isOperational()) { 
      new AlertDialog. 
        Builder(this). 
        setMessage("Text recognizer could not be set up on your device").show(); 
      return; 
     } 

     Frame frame = new Frame.Builder().setBitmap(bitmap).build(); 
     SparseArray<TextBlock> origTextBlocks = textRecognizer.detect(frame); 
     List<TextBlock> textBlocks = new ArrayList<>(); 


     for (int i = 0; i < origTextBlocks.size(); i++) { 
      TextBlock textBlock = origTextBlocks.valueAt(i); 
      textBlocks.add(textBlock); 
     } 
     Collections.sort(textBlocks, new Comparator<TextBlock>() { 
      @Override 
      public int compare(TextBlock o1, TextBlock o2) { 
       int diffOfTops = o1.getBoundingBox().top - o2.getBoundingBox().top; 
       int diffOfLefts = o1.getBoundingBox().left - o2.getBoundingBox().left; 
       if (diffOfTops != 0) { 
        return diffOfTops; 
       } 
       return diffOfLefts; 
      } 
     }); 

     StringBuilder detectedText = new StringBuilder(); 
     for (TextBlock textBlock : textBlocks) { 
      if (textBlock != null && textBlock.getValue() != null) { 
       detectedText.append(textBlock.getValue()); 
       detectedText.append("\n"); 
      } 
     } 

     detectedTextView.setText(detectedText);  // detectedText is a final string 
    } 
    finally { 
     textRecognizer.release(); 
    } 
} 



private void inspect(Uri uri) { 
    InputStream is = null; 
    Bitmap bitmap = null; 
    try { 
     is = getContentResolver().openInputStream(uri); 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
     options.inSampleSize = 2; 
     options.inScreenDensity = DisplayMetrics.DENSITY_LOW; 
     bitmap = BitmapFactory.decodeStream(is, null, options); 

     Bitmap rotatedMap = RotateBitmap(bitmap,90); 

     inspectFromBitmap(rotatedMap); 
    } catch (FileNotFoundException e) { 
     Log.w(TAG, "Failed to find the file: " + uri, e); 
    } finally { 
     if (bitmap != null) { 
      bitmap.recycle(); 
     } 
     if (is != null) { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       Log.w(TAG, "Failed to close InputStream", e); 
      } 
     } 
    } 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 
     case REQUEST_GALLERY: 
      if (resultCode == RESULT_OK) { 
       inspect(data.getData()); 
      } 
      break; 
     case REQUEST_CAMERA: 
      if (resultCode == RESULT_OK) { 
       if (imageUri != null) { 
        inspect(imageUri); 
       } 
      } 
      break; 
     default: 
      super.onActivityResult(requestCode, resultCode, data); 
      break; 
    } 
} 


public static Bitmap RotateBitmap(Bitmap source, float angle) // it rotates the bitmap for given parameter 
{ 
    Matrix matrix = new Matrix(); 
    matrix.postRotate(angle); 
    return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true); 
} 

그런 경우 어떻게해야합니까? 고마워.

답변

0

아니요, ACTION_IMAGE_CAPTURE 의도를 충족하는 카메라 앱의 레이아웃을 변경할 수 없습니다. 실제로, 다른 장치에는 동일한 카메라 앱이 없을 것입니다. 각각은 매우 다른 모양과 느낌을 가질 수 있습니다. 레이아웃과 UX를 제어하려면 '사용자 정의 카메라'가 필요합니다.