SheldonShane Ответов: 2

Приложение для Android показывает черный экран после съемки, но работает при подключении к отладчику


Я борюсь с этой проблемой уже несколько дней и, похоже, не могу ее преодолеть. В основном у меня есть действие, которое имеет 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();
        }
    }


Что я уже пробовал:

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

David Crow

Итак, поскольку вы не можете установить точки останова и пошагово пройти через код, как насчет добавления ListView управление макетом и отправка в него отладочного текста. Таким образом, вы можете знать значения переменных на этом пути и где происходит (не) выполнение кода?

SheldonShane

Спасибо за предложение Дэвид, однако даже listview не обновляется - это почти так же, как если бы приложение застряло и не обрабатывалось дальше. Я попытался создать новый поток в OnActivityResult - теперь я возвращаюсь к исходному экрану, но listview и imageviews все еще не обновляются

Pratishkumar Kushwaha

Вы можете отправить ссылку на приложение, я могу ее проверить.

SheldonShane

Привет, Пратишкумар, спасибо за предложение помощи - я очень открыт для обмена приложением с вами, как я могу связаться с вами?

Pratishkumar Kushwaha

Спасибо что запросили мой электронный идентификатор pratishbloge@gmail.com
вы можете отправить заявку по этому идентификатору электронной почты,я могу вам помочь.

SheldonShane

Привет Пратишкумар, больше не нужно делиться приложением, с вашим советом мне удалось решить эту проблему, пожалуйста, смотрите ниже для полного решения.

[no name]

1

2 Ответов

Рейтинг:
6

SheldonShane

Добрый День Всем,

Мне удалось исправить приложение благодаря комментарию Пратишкумара Кушвахи, после сжатия изображения все работает нормально.

Метод 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;
   }


Pratishkumar Kushwaha

Хороший Кодекс Братана

[no name]

1

Рейтинг:
2

Pratishkumar Kushwaha

Вы можете проверить журнал cat в android mobile и проверить исключение.
Тогда исключение-это память из исключения, чем ваш imgPhoto1 имеет очень высокое разрешение.
Затем вы можете сжать файл и снова использовать эту проблему, вы можете решить ее.


SheldonShane

Спасибо Пратишкумар, но я боюсь, что не следую за вами в решении, я открыт для обмена приложением с вами, есть ли способ, которым я могу безопасно сделать это?

[no name]

1