Преобразование изображения в строку с использованием алгоритма Base64

Я новичок в андроиде. Я пытаюсь захватить изображение и сохранить его в firebase. Поскольку нам нужно преобразовать изображение в строку, а затем сохранить его в firebase, я использую алгоритм base64.

Методы захвата изображения и его сохранения в базе данных:

public void capturePhoto(View v) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, CAMERA_REQUEST);
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
            Bitmap photo = (Bitmap) data.getExtras().get("data");

            ImageView imageView = (ImageView) findViewById(R.id.imageView);
            imageView.setImageBitmap(photo);

        }
    }

    public void storeDatabase(View v)
    {
        EditText editRollno = (EditText) findViewById(R.id.rollno);
        EditText editname = (EditText) findViewById(R.id.name);
        EditText editmarks = (EditText) findViewById(R.id.marks);
        Firebase ref1 = ref.child("student_information").child("Student" + n);
        ref1.child("Name").setValue(editname.getText().toString());
        ref1.child("Rollno").setValue(editRollno.getText().toString());
        ref1.child("Marks").setValue(editmarks.getText().toString());
        Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.abc);//your image
        ByteArrayOutputStream bYtE = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 100, bYtE);
        bmp.recycle();
        byte[] byteArray = bYtE.toByteArray();
        imageFile = Base64.encodeToString(byteArray, Base64.DEFAULT);
        ref1.child("Image").setValue(imageFile);
        n++;
}

Когда я нажимаю кнопку отправки, загрузка значений занимает много времени. Более того, много раз я вижу линию

Skipped 537 frames!  The application may be doing too much work on its main thread.

в Android-мониторе.

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


person Richa Tibrewal    schedule 05.03.2016    source источник
comment
Если размер изображения большой, выполните эту операцию в фоновом потоке. Используйте AsyncTask.   -  person Jyotman Singh    schedule 05.03.2016
comment
Размер файла изображения составляет 1,01 МБ.   -  person Richa Tibrewal    schedule 05.03.2016
comment
Да, это большой, я думаю. В любом случае вам следует выполнять тяжелую операцию, например обработку изображений, в фоновом потоке. Так у вас не будет проблем.   -  person Jyotman Singh    schedule 05.03.2016
comment
перед загрузкой изображения вы можете сжать изображение   -  person saeed    schedule 05.03.2016
comment
для лучшего сжатия voidcanvas.com/whatsapp-like-image-compression-in- андроид   -  person saeed    schedule 05.03.2016
comment
Кнопка "Отправить"? Когда вызывается storeDatabase()? storeDatabase берет файл из ресурса. Не с камеры. Почему вы сначала конвертируете файл ресурсов в растровое изображение? Можно ожидать проблем с памятью.   -  person greenapps    schedule 05.03.2016
comment
В макете есть кнопка отправки. При нажатии кнопки отправки вызывается storeDatabase().   -  person Richa Tibrewal    schedule 05.03.2016
comment
Так вы не на все мои комментарии реагируете. Любая причина?   -  person greenapps    schedule 05.03.2016
comment
Вы импортируете класс Base64 из собственной библиотеки Android или любой сторонней библиотеки ?? import android.util.Base64;   -  person Vikrant Kashyap    schedule 05.03.2016
comment
Я написал импорт android.until.Base64   -  person Richa Tibrewal    schedule 05.03.2016
comment
Преобразование 1 МБ данных в другой формат потребует времени и поэтому не должно выполняться в потоке пользовательского интерфейса. Решение всегда одно и то же: выполнять работу за пределами основного потока, например, в файле AsyncTask. См. stackoverflow.com/questions/21507967/   -  person Frank van Puffelen    schedule 05.03.2016


Ответы (1)


Для хранения в базе данных я бы определенно использовал AsyncTask для этого. Итак, у вас может быть отдельный класс, который делает следующее:

private class ImageDBManager extends AsyncTask< String, Integer, Void> {
    protected Long doInBackground(String... items) {
     int count = items.length;
     String editRoll = items[0];
     String editName = items[1];
     String editMarks = items[2];
     Firebase ref1 = ref.child("student_information").child("Student" + n);
    ref1.child("Name").setValue(editname.getText().toString());
    ref1.child("Rollno").setValue(editRoll);
    ref1.child("Marks").setValue(editName);
    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.abc);//your image
    ByteArrayOutputStream bYtE = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.PNG, 100, bYtE);
    bmp.recycle();
    byte[] byteArray = bYtE.toByteArray();
    imageFile = Base64.encodeToString(byteArray, Base64.DEFAULT);
    ref1.child("Image").setValue(imageFile);
 }

 protected void onProgressUpdate(Integer... progress) {
     setProgressPercent(progress[0]);
 }

 protected void onPostExecute(){

 }

}

И затем назовите это так:

public void storeDatabase(View v) {
    ImageDBManager manager = new ImageDBManager();
    EditText editRollno = (EditText) findViewById(R.id.rollno);
    EditText editname = (EditText) findViewById(R.id.name);
    EditText editmarks = (EditText) findViewById(R.id.marks);
    manager.execute(new String[] { editRollno.getText(), editname.getText(), editmarks.getText() }

}

Если вы захватываете изображение с камеры, лучшая ссылка находится здесь http://developer.android.com/training/camera/photobasics.html

это та же самая идея запуска действия и реализации onActivityForResult, где вы получаете данные из дополнений в результате, поэтому вместо получения растрового изображения из R.drawable.abc вы получите его вот так в onActivityForResult

Bitmap imageBitmap = (Bitmap) extras.get("data");
person Peter Hale    schedule 05.03.2016
comment
Спасибо. Что, если изображение, которое мне нужно загрузить, щелкнет камера? Тогда что мне написать вместо R.drawable.abc? - person Richa Tibrewal; 05.03.2016
comment
Я обновил ответ, чтобы включить некоторые детали при захвате изображения. - person Peter Hale; 09.03.2016