Как добавить сохранение изображения в qr-код, сгенерированный в Android Studio?

#java #android

Вопрос:

Я создаю QR — код в Android Studio. Я хочу сохранить сгенерированное изображение QR — кода в галерее. Однако мне это не удалось. Можно ли сохранить его в галерею с помощью кнопки «Сохранить»?

 import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import androidmads.library.qrgenearator.QRGContents;
import androidmads.library.qrgenearator.QRGEncoder;



public class GenerateActivity extends AppCompatActivity {
    private Button saveBtn, createBtn;
    private ImageView qrImage;
    private EditText qrValue;

    public void init() {
        qrValue = findViewById(R.id.qrValue);
        qrImage = findViewById(R.id.qrImage);
        createBtn = findViewById(R.id.createBtn);
        saveBtn = findViewById(R.id.saveBtn);

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


        ActivityCompat.requestPermissions(GenerateActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        ActivityCompat.requestPermissions(GenerateActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);

        createBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String data = qrValue.getText().toString();
                QRGEncoder qrgEncoder = new QRGEncoder(data, null, QRGContents.Type.TEXT, 500);
                Bitmap bitmap = qrgEncoder.getBitmap();
                qrImage.setImageBitmap(bitmap);
    
            }
        });

    }

}
 

Комментарии:

1. Цитата с github: Сохранить QR-код в виде изображения // Сохранить с указанием местоположения, значения, возвращенного растрового изображения и типа изображения(JPG/PNG). QRGSaver qrgSaver = новый QRGSaver(); qrgSaver.save(путь сохранения, значение EDT.getText().toString().trim(), растровое изображение, QRGContents. Тип изображения. IMAGE_JPEG);

Ответ №1:

Это уже было объяснено в этом репо.

 // Initializing the QR Encoder with your value to be encoded, type you required and Dimension
QRGEncoder qrgEncoder = new QRGEncoder(inputValue, null, QRGContents.Type.TEXT, smallerDimension);
qrgEncoder.setColorBlack(Color.RED);
qrgEncoder.setColorWhite(Color.BLUE);
try {
  // Getting QR-Code as Bitmap
  bitmap = qrgEncoder.getBitmap();
  // Setting Bitmap to ImageView
  qrImage.setImageBitmap(bitmap);
} catch (WriterException e) {
  Log.v(TAG, e.toString());
}
 

Сохраните QR-код в виде изображения

 // Save with location, value, bitmap returned and type of Image(JPG/PNG).
QRGSaver qrgSaver = new QRGSaver();
qrgSaver.save(savePath, edtValue.getText().toString().trim(), bitmap, QRGContents.ImageType.IMAGE_JPEG);

 

Сохраните сгенерированный QR-код в галерее:

 private String savePath = Environment.getExternalStorageDirectory().getPath()   "/QRCode/";

yourButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                    try {
                        boolean save = new QRGSaver().save(savePath, edtValue.getText().toString().trim(), bitmap, QRGContents.ImageType.IMAGE_JPEG);
                        String result = save ? "Image Saved" : "Image Not Saved";
                        Toast.makeText(activity, result, Toast.LENGTH_LONG).show();
                        edtValue.setText(null);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {
                    ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
                }
            }
        });

 

для получения более подробной информации

Комментарии:

1. Спасибо за вашу помощь. Но картинка не сохраняется. Я сделал все шаги, что бы я ни пытался, это не спасает. Там написано «Изображение не сохранено».

Ответ №2:

Используйте следующий код для сохранения сгенерированного растрового изображения.

Для Котлина.

 private fun saveImage(bitmap:Bitmap):Boolean{
    val saved:Boolean
    val fos:OutputStream

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        val contentValues =  ContentValues()
        contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, System.currentTimeMillis())
        contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png")
        contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/"   "QR")
        val imageUri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
        fos = contentResolver.openOutputStream(imageUri!!)!!
    } else {
        val imagesDir = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_DCIM).toString()   File.separator   "QR"

        val file = File(imagesDir)

        if (!file.exists()) {
            file.mkdir()
        }

        val image = File(imagesDir, "${System.currentTimeMillis()}.png")
        fos = FileOutputStream(image)

    }

    saved = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)
    fos.flush()
    fos.close()
    return saved
}
 

Для Java

 private boolean saveImage(Bitmap bitmap) throws IOException {
    boolean saved;
    OutputStream fos=null;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        ContentValues contentValues =new  ContentValues();
        contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, System.currentTimeMillis());
        contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png");
        contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/"   "QR");
        Uri imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
        try {
            fos = getContentResolver().openOutputStream(imageUri);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    } else {
        String imagesDir = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_DCIM).toString()   File.separator   "QR";

        File file =new File(imagesDir);

        if (!file.exists()) {
            file.mkdir();
        }

        File image =new File(imagesDir, "${System.currentTimeMillis()}.png");
        try {
            fos =new FileOutputStream(image);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }

    saved = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
    assert fos != null;
    fos.flush();
    fos.close();
    return saved;
}
 

Комментарии:

1. если (!file.mkdir()) вернется;

2. Я новичок, это для java?

3. Этот код написан на Kotlin, вы должны преобразовать его в Java.

4. Я добавил эквивалентный код java. Разберись в этом.

5. Спасибо вам за ответ. Как мне интегрировать этот код в кнопку «Сохранить».