#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. Спасибо вам за ответ. Как мне интегрировать этот код в кнопку «Сохранить».