나는 며칠 동안이 문제로 어려움을 겪어 왔으며 지나칠 수없는 것 같습니다. 기본적으로 카메라 인 텐트를 시작하는 버튼이있는 3 개의 이미지 뷰가있는 활동이 있습니다.
문제는 디버거를 통해 개발하고 실행하는 동안 모든 것이 완벽하게 작동하지만 사진 미리보기를 수락 한 후 앱을 단독으로 실행하면 (디버거가 아닌 전화로만) 검은 화면이 표시되고 그 후에는 아무것도하지 않는다는 것입니다 .
필요한 것은 사진이 이미지보기에 표시되고 갤러리에 저장되는 것뿐입니다. 디버그 모드에서는이 모든 작업을 수행하지만 앱을 독립적으로 실행해야하는 경우에는 수행하지 않습니다.
나는이 문제로 완전히 잃어 버렸습니다. 누군가 / 누구든지 나를 도울 수 있습니다.
나는 이것이 비동기 문제라고 생각하지만 나는 안드로이드에 매우 익숙하지 않고 이것을 구현하는 방법을 모르겠습니다. 내 머리와 내가 읽은 / 시청 한 튜토리얼을 통해-이것은 쉬운 과정이어야하지만 얻을 수는 없습니다. 일하다
활동 레이아웃에 대한 내 코드는 다음과 같습니다.
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".PhotoActivity">
<ImageView
android:id="@+id/imgPhoto1"
android:layout_width="236dp"
android:layout_height="136dp"
android:layout_marginTop="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/dds_logo" />
<ImageView
android:id="@+id/imgPhoto2"
android:layout_width="236dp"
android:layout_height="136dp"
android:layout_marginTop="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imgPhoto1"
app:srcCompat="@drawable/dds_logo" />
<ImageView
android:id="@+id/imgPhoto3"
android:layout_width="236dp"
android:layout_height="136dp"
android:layout_marginTop="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imgPhoto2"
app:srcCompat="@drawable/dds_logo" />
<Button
android:id="@+id/btnTakePhoto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="52dp"
android:text="Take Photo"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imgPhoto3"
app:layout_constraintVertical_bias="1.0" />
</android.support.constraint.ConstraintLayout>
다음은 onClick 이벤트에 대한 코드입니다.
public void onClick(View v) {
try {
//respond to clicks
if (v.getId() == R.id.btnTakePhoto) {
captureImage();
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
인 텐트에 대한 호출은 다음과 같습니다.
private void captureImage() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePictureIntent, CAPTURE_IMAGE_REQUEST);
}
다음은 onActivtyResult입니다.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
try{
if (!Debug.isDebuggerConnected()){
Debug.waitForDebugger();
Log.d("debug", "started"); // Insert a breakpoint at this line!!
}
if(numPhotos < 2) {
Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap) extras.get("data");
String savedImageURL = MediaStore.Images.Media.insertImage(
getContentResolver(),
imageBitmap,
"Serial",
"Refresh Verification photo"
);
switch (numPhotos) {
case 0:
imgPhoto1.setImageBitmap(imageBitmap);
break;
case 1:
imgPhoto2.setImageBitmap(imageBitmap);
break;
case 2:
imgPhoto3.setImageBitmap(imageBitmap);
break;
}
numPhotos++;
}
else
{
numPhotos = 0;
Toast.makeText(PhotoActivity.this, "Max # of ohotos reached", Toast.LENGTH_LONG).show();
Intent i = new Intent(getApplicationContext(), MenuActivity.class);
startActivity(i);
finish();
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
모두 좋은 날,
문제를 해결할 수 있었는데 카메라로 촬영 한 이미지의 품질이 너무 높아서 발생합니다.
이미지를 압축 한 후 모든 것이 잘 작동합니다 (미리보기 및 저장 모두), 변경해야 할 유일한 것은 OnActivityResult 메서드입니다.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
try {
Bundle extras = data.getExtras();
final Bitmap imageBitmap = (Bitmap) extras.get("data");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
imageBitmap.compress(Bitmap.CompressFormat.JPEG, 60, bytes);
byte[] byteArray = bytes.toByteArray();
final Bitmap compressedBitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
if (numPhotos < 3) {
switch (numPhotos) {
case 0:
imgPhoto1.setImageBitmap(compressedBitmap);
savebitmap(compressedBitmap);
numPhotos++;
break;
case 1:
imgPhoto2.setImageBitmap(compressedBitmap);
savebitmap(compressedBitmap);
numPhotos++;
break;
case 2:
imgPhoto3.setImageBitmap(compressedBitmap);
savebitmap(compressedBitmap);
numPhotos = 0;
Toast.makeText(PhotoActivity.this, "Max # of ohotos reached", Toast.LENGTH_LONG).show();
Intent i = new Intent(getApplicationContext(), MenuActivity.class);
startActivity(i);
finish();
break;
}
} else {
numPhotos = 0;
Toast.makeText(PhotoActivity.this, "Max # of ohotos reached", Toast.LENGTH_LONG).show();
Intent i = new Intent(getApplicationContext(), MenuActivity.class);
startActivity(i);
finish();
}
}
catch(Exception e){
e.printStackTrace();;
}
}
다음은 savebitmap 메소드입니다.
public static File savebitmap(Bitmap bmp) throws IOException {
String date = new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault()).format(new Date());
File folder = new File(Environment.getExternalStorageDirectory()
+ "/RefreshPhotos");
boolean var = false;
if (!folder.exists())
var = folder.mkdir();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
File f = new File(folder
+ File.separator + "RefreshPhoto_" + date + ".png");
f.createNewFile();
FileOutputStream fo = new FileOutputStream(f);
fo.write(bytes.toByteArray());
fo.close();
return f;
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다