Черный экран в приложении для Android после съемки, но он работает при подключении к отладчику - PullRequest
1 голос
/ 02 апреля 2019

Я боролся с этой проблемой уже несколько дней и, похоже, не могу ее преодолеть. В основном у меня есть действие, которое имеет 3 просмотра изображений с кнопкой, которая запускает намерение камеры

Проблема в том, что, пока я разрабатываю и запускаю через отладчик, все работает отлично, но не тогда, когда я запускаю приложение в одиночку (без отладчика, только на телефоне) после принятия предварительного просмотра изображения, он просто показывает черный экран и делает ничего после этого.

Все, что нужно, это чтобы изображение отображалось в представлениях изображений и сохранялось в галерее, оно делает все это в режиме отладки, но не когда мне нужно запустить приложение независимо.

Я полностью растерялся из-за этой проблемы - пожалуйста, кто-нибудь / кто-нибудь может мне помочь.

Я думаю, что это может быть асинхронная проблема, но я очень плохо знаком с android и не знаю, как реализовать это, в моей голове и в учебниках, которые я читал / смотрел - это должен быть простой процесс, однако я не могу показаться заставить его работать

Вот мой код на макете для действия:

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

1 Ответ

0 голосов
/ 08 апреля 2019

Good Day All,

Мне удалось решить проблему, это происходит из-за слишком высокого качества изображения, получаемого камерой.

После сжатия изображения все работает нормально (предварительный просмотр и сохранение), единственное, что мне нужно было изменить, это метод 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;
    }
...