Как получить разрешение на загрузку изображений в мое приложение? ⇐ JAVA
-
Anonymous
Как получить разрешение на загрузку изображений в мое приложение?
Привет, мне нужно загрузить изображения в мое приложение, но я не могу отобразить окно разрешения для этого, поэтому я попытался загрузить изображение без разрешения, но база данных получает нулевое поле в поле изображения, и кажется, что разрешение не требуется. для приложения, потому что оно все равно не отображается в настройках приложения, пожалуйста, нужна помощь:
пакет com.example.asd; импортировать android.Manifest; импортировать android.content.Intent; импортировать android.content.pm.PackageManager; импортировать android.database.Cursor; импортировать android.net.Uri; импортировать android.os.Build; импортировать android.os.Bundle; импортировать android.provider.MediaStore; импортировать android.util.Log; импортировать android.view.View; импортировать android.widget.ArrayAdapter; импортировать android.widget.Button; импортировать android.widget.EditText; импортировать android.widget.ImageButton; импортировать android.widget.Spinner; импортировать android.widget.Toast; импортировать androidx.annotation.NonNull; импортировать androidx.appcompat.widget.Toolbar; импортировать androidx.appcompat.app.ActionBar; импортировать androidx.appcompat.app.AppCompatActivity; импортировать androidx.activity.result.ActivityResultLauncher; импортировать androidx.activity.result.contract.ActivityResultContracts; импортировать java.io.ByteArrayOutputStream; импортировать java.io.IOException; импортировать java.io.InputStream; импортировать java.util.List; публичный класс SubirRecetas расширяет AppCompatActivity { частный EditText edtNombre, edtIngredientes, edtInstrucciones; частный ImageButton btnImagen; частная строка imagenPath; частная кнопка SubirRecetas; частный Spinner spinnerCategoria; частный int idUsuario; // Присвоение доблести, соответствующей корреспонденции личное даоУсуарио дао; частный окончательный ActivityResultLauncher GalleryLauncher = RegisterForActivityResult( новый ActivityResultContracts.StartActivityForResult(), результат -> { if (result.getResultCode() == AppCompatActivity.RESULT_OK) { Данные намерения = result.getData(); если (данные!= ноль) { Uri uri = data.getData(); imagenPath = getPathFromUri (uri); btnImagen.setImageURI(uri); } } } ); частный статический финал int REQUEST_READ_EXTERNAL_STORAGE_PERMISSION = 1; @Override общедоступное логическое значение onSupportNavigateUp() { onBackPressed(); вернуть super.onSupportNavigateUp(); } @Override protected void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); setContentView(R.layout.activity_subir_recetas); // Разрешение адвоката если (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_READ_EXTERNAL_STORAGE_PERMISSION); } еще { // Продолжение инициализации активности инициализироватьАктивность(); } // Получение идентификатора пользователя (добавленный способ, который может быть использован после предыдущей активности) Намерение намерение = getIntent(); если (намерение!= ноль) { idUsuario = Intento.getIntExtra("idUsuario", -1); // Предполагаем, что "idUsuario" используется для ввода идентификатора } Bundle b = getIntent().getExtras(); если (б != ноль) { idUsuario = b.getInt("id"); } Панель инструментов Toolbar = findViewById(R.id.toolbarB); setSupportActionBar (панель инструментов); ActionBar actionBar = getSupportActionBar(); утверждать actionBar != null; actionBar.setTitle("Подробнее"); actionBar.setDisplayShowHomeEnabled(истина); actionBar.setDisplayHomeAsUpEnabled(истина); дао = новый daoUsuario (это); List categoriasList = dao.selectCategorias(); если (categoriasList.isEmpty()) { Toast.makeText(this, "В базе данных нет категорий", Toast.LENGTH_SHORT).show(); // Управляйте домом, где нет доступных категорий возвращаться; } spinnerCategoria = findViewById(R.id.spinnerCategoria); ArrayAdapter адаптерSpinner = новый ArrayAdapter(this, android.R.layout.simple_spinner_item, categoriasList); адаптерSpinner.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerCategoria.setAdapter(adapterSpinner); edtNombre = findViewById(R.id.NombreReceta); edtIngredientes = findViewById(R.id.Ingrediente); edtInstrucciones = findViewById(R.id.Descripcion); btnImagen = findViewById(R.id.imagen); SubirRecetas = findViewById(R.id.SubirRecetas); btnImagen.setOnClickListener(v -> { // Проверка разрешения до открытия галереи если (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { Намерение намерение = новое намерение (Intent.ACTION_PICK); Intent.setType("изображение/*"); галереяLauncher.launch(намерение); } еще { // Запросить разрешение, если вы не уступили requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_READ_EXTERNAL_STORAGE_PERMISSION); Log.d("Разрешение", "Разрешение не предоставлено. Запрашиваю разрешение."); } }); UploadRecipes.setOnClickListener(v -> { Имя строки = edtName.getText().toString(); Строковые ингредиенты = edtIngredients.getText().toString(); Строковые инструкции = edtInstructions.getText().toString(); if (imagePath == null || imagePath.isEmpty()) { Toast.makeText(this, «Выберите изображение», Toast.LENGTH_SHORT).show(); возвращаться; } byte[] imageBytes = ConvertImageBytes(Uri.parse(imagePath)); если (идентификатор пользователя == 0) { Toast.makeText(this: «Перед загрузкой рецепта необходимо пройти аутентификацию», Toast.LENGTH_SHORT).show(); возвращаться; } Категория строки = spinnerCategoria.getSelectedItem().toString(); addRecipe(название, ингредиенты, инструкции, imageBytes, категория); // Очистка полей после успешной загрузки рецепта очистить поля(); }); } @Override public void onRequestPermissionsResult(int requestCode, разрешения @NonNull String[], @NonNull int[]grantResults) { super.onRequestPermissionsResult(requestCode, разрешения, GrantResults); если (requestCode == REQUEST_READ_EXTERNAL_STORAGE_PERMISSION) { // Проверяем, было ли предоставлено разрешение if (grantResults.length > 0 && GrantResults[0] == PackageManager.PERMISSION_GRANTED) { //Разрешение предоставлено, продолжаем инициализацию активности инициализироватьАктивность(); } еще { // Разрешение не предоставлено, отобразить сообщение или выполнить какое-либо действие Toast.makeText(this, «Разрешение на хранение не предоставлено», Toast.LENGTH_SHORT).show(); } } } частная недействительная инициализацияActivity () { // Получаем идентификатор пользователя (почему-то он может быть из предыдущего действия) Намерение намерение = getIntent(); если (попробуйте!= ноль) { userid = Intent.getExtraInt("userid", -1); // Предполагая, что "Идентификатор пользователя" это клава, используемая для пропуска удостоверения личности } } частная пустота limpiarCampos () { edtNombre.getText().clear(); edtIngredientes.getText().clear(); edtInstrucciones.getText().clear(); btnImagen.setImageURI(ноль); spinnerCategoria.setSelection(0); } частная строка getPathFromUri (Uri uri) { Проекция String[] = {MediaStore.Images.Media.DATA}; Курсор курсора = getContentResolver().query(uri, проекция, ноль, ноль, ноль); если (курсор != ноль) { курсор.moveToFirst(); int columns_index = курсор.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); Строка filePath = курсор.getString(column_index); курсор.закрыть(); вернуть путь к файлу; } еще { вернуть uri.getPath(); } } частный байт[] ConvertirImagenBytes (Uri uri){ пытаться { InputStream inputStream = getContentResolver().openInputStream(uri); если (inputStream!= ноль) { ByteArrayOutputStream byteArrayOutputStream = новый ByteArrayOutputStream (); буфер байт[] = новый байт[1024]; число байтовRead; while ((bytesRead = inputStream.read(buffer)) != -1) { byteArrayOutputStream.write(буфер, 0, bytesRead); } inputStream.close(); вернуть byteArrayOutputStream.toByteArray(); } еще { Toast.makeText(this, «Ошибка отмены входа в систему», Toast.LENGTH_SHORT).show(); } } catch (IOException e) { е.printStackTrace(); Toast.makeText(this, «Ошибка преобразования изображения в байты», Toast.LENGTH_SHORT).show(); } вернуть ноль; } Private void agregarReceta (Номер строки, Ингредиенты строки, Инструкции по строке, byte[] imagenBytes, строковая категория){ если (номбре.isEmpty()) { Toast.makeText(this, "Номер письма не может быть пустым", Toast.LENGTH_SHORT).show(); возвращаться; } пытаться { int idCategoria = dao.obtenerIdCategoria(категория); если (idCategoria != -1) { dao.insertarReceta(idCategoria, idUsuario, номер, ингредиенты, инструкции, imagenBytes); Toast.makeText(this, "La receta ha sido subida con éxito", Toast.LENGTH_SHORT).show(); } еще { Toast.makeText(this, «Категория без изменений в базе данных», Toast.LENGTH_SHORT).show(); } } catch (Исключение е) { е.printStackTrace(); Toast.makeText(this, «Ошибка при получении сообщения», Toast.LENGTH_SHORT).show(); } } } Пыталась без разрешения, но в поле img базы данных установлено значение null
Привет, мне нужно загрузить изображения в мое приложение, но я не могу отобразить окно разрешения для этого, поэтому я попытался загрузить изображение без разрешения, но база данных получает нулевое поле в поле изображения, и кажется, что разрешение не требуется. для приложения, потому что оно все равно не отображается в настройках приложения, пожалуйста, нужна помощь:
пакет com.example.asd; импортировать android.Manifest; импортировать android.content.Intent; импортировать android.content.pm.PackageManager; импортировать android.database.Cursor; импортировать android.net.Uri; импортировать android.os.Build; импортировать android.os.Bundle; импортировать android.provider.MediaStore; импортировать android.util.Log; импортировать android.view.View; импортировать android.widget.ArrayAdapter; импортировать android.widget.Button; импортировать android.widget.EditText; импортировать android.widget.ImageButton; импортировать android.widget.Spinner; импортировать android.widget.Toast; импортировать androidx.annotation.NonNull; импортировать androidx.appcompat.widget.Toolbar; импортировать androidx.appcompat.app.ActionBar; импортировать androidx.appcompat.app.AppCompatActivity; импортировать androidx.activity.result.ActivityResultLauncher; импортировать androidx.activity.result.contract.ActivityResultContracts; импортировать java.io.ByteArrayOutputStream; импортировать java.io.IOException; импортировать java.io.InputStream; импортировать java.util.List; публичный класс SubirRecetas расширяет AppCompatActivity { частный EditText edtNombre, edtIngredientes, edtInstrucciones; частный ImageButton btnImagen; частная строка imagenPath; частная кнопка SubirRecetas; частный Spinner spinnerCategoria; частный int idUsuario; // Присвоение доблести, соответствующей корреспонденции личное даоУсуарио дао; частный окончательный ActivityResultLauncher GalleryLauncher = RegisterForActivityResult( новый ActivityResultContracts.StartActivityForResult(), результат -> { if (result.getResultCode() == AppCompatActivity.RESULT_OK) { Данные намерения = result.getData(); если (данные!= ноль) { Uri uri = data.getData(); imagenPath = getPathFromUri (uri); btnImagen.setImageURI(uri); } } } ); частный статический финал int REQUEST_READ_EXTERNAL_STORAGE_PERMISSION = 1; @Override общедоступное логическое значение onSupportNavigateUp() { onBackPressed(); вернуть super.onSupportNavigateUp(); } @Override protected void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); setContentView(R.layout.activity_subir_recetas); // Разрешение адвоката если (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_READ_EXTERNAL_STORAGE_PERMISSION); } еще { // Продолжение инициализации активности инициализироватьАктивность(); } // Получение идентификатора пользователя (добавленный способ, который может быть использован после предыдущей активности) Намерение намерение = getIntent(); если (намерение!= ноль) { idUsuario = Intento.getIntExtra("idUsuario", -1); // Предполагаем, что "idUsuario" используется для ввода идентификатора } Bundle b = getIntent().getExtras(); если (б != ноль) { idUsuario = b.getInt("id"); } Панель инструментов Toolbar = findViewById(R.id.toolbarB); setSupportActionBar (панель инструментов); ActionBar actionBar = getSupportActionBar(); утверждать actionBar != null; actionBar.setTitle("Подробнее"); actionBar.setDisplayShowHomeEnabled(истина); actionBar.setDisplayHomeAsUpEnabled(истина); дао = новый daoUsuario (это); List categoriasList = dao.selectCategorias(); если (categoriasList.isEmpty()) { Toast.makeText(this, "В базе данных нет категорий", Toast.LENGTH_SHORT).show(); // Управляйте домом, где нет доступных категорий возвращаться; } spinnerCategoria = findViewById(R.id.spinnerCategoria); ArrayAdapter адаптерSpinner = новый ArrayAdapter(this, android.R.layout.simple_spinner_item, categoriasList); адаптерSpinner.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerCategoria.setAdapter(adapterSpinner); edtNombre = findViewById(R.id.NombreReceta); edtIngredientes = findViewById(R.id.Ingrediente); edtInstrucciones = findViewById(R.id.Descripcion); btnImagen = findViewById(R.id.imagen); SubirRecetas = findViewById(R.id.SubirRecetas); btnImagen.setOnClickListener(v -> { // Проверка разрешения до открытия галереи если (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { Намерение намерение = новое намерение (Intent.ACTION_PICK); Intent.setType("изображение/*"); галереяLauncher.launch(намерение); } еще { // Запросить разрешение, если вы не уступили requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_READ_EXTERNAL_STORAGE_PERMISSION); Log.d("Разрешение", "Разрешение не предоставлено. Запрашиваю разрешение."); } }); UploadRecipes.setOnClickListener(v -> { Имя строки = edtName.getText().toString(); Строковые ингредиенты = edtIngredients.getText().toString(); Строковые инструкции = edtInstructions.getText().toString(); if (imagePath == null || imagePath.isEmpty()) { Toast.makeText(this, «Выберите изображение», Toast.LENGTH_SHORT).show(); возвращаться; } byte[] imageBytes = ConvertImageBytes(Uri.parse(imagePath)); если (идентификатор пользователя == 0) { Toast.makeText(this: «Перед загрузкой рецепта необходимо пройти аутентификацию», Toast.LENGTH_SHORT).show(); возвращаться; } Категория строки = spinnerCategoria.getSelectedItem().toString(); addRecipe(название, ингредиенты, инструкции, imageBytes, категория); // Очистка полей после успешной загрузки рецепта очистить поля(); }); } @Override public void onRequestPermissionsResult(int requestCode, разрешения @NonNull String[], @NonNull int[]grantResults) { super.onRequestPermissionsResult(requestCode, разрешения, GrantResults); если (requestCode == REQUEST_READ_EXTERNAL_STORAGE_PERMISSION) { // Проверяем, было ли предоставлено разрешение if (grantResults.length > 0 && GrantResults[0] == PackageManager.PERMISSION_GRANTED) { //Разрешение предоставлено, продолжаем инициализацию активности инициализироватьАктивность(); } еще { // Разрешение не предоставлено, отобразить сообщение или выполнить какое-либо действие Toast.makeText(this, «Разрешение на хранение не предоставлено», Toast.LENGTH_SHORT).show(); } } } частная недействительная инициализацияActivity () { // Получаем идентификатор пользователя (почему-то он может быть из предыдущего действия) Намерение намерение = getIntent(); если (попробуйте!= ноль) { userid = Intent.getExtraInt("userid", -1); // Предполагая, что "Идентификатор пользователя" это клава, используемая для пропуска удостоверения личности } } частная пустота limpiarCampos () { edtNombre.getText().clear(); edtIngredientes.getText().clear(); edtInstrucciones.getText().clear(); btnImagen.setImageURI(ноль); spinnerCategoria.setSelection(0); } частная строка getPathFromUri (Uri uri) { Проекция String[] = {MediaStore.Images.Media.DATA}; Курсор курсора = getContentResolver().query(uri, проекция, ноль, ноль, ноль); если (курсор != ноль) { курсор.moveToFirst(); int columns_index = курсор.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); Строка filePath = курсор.getString(column_index); курсор.закрыть(); вернуть путь к файлу; } еще { вернуть uri.getPath(); } } частный байт[] ConvertirImagenBytes (Uri uri){ пытаться { InputStream inputStream = getContentResolver().openInputStream(uri); если (inputStream!= ноль) { ByteArrayOutputStream byteArrayOutputStream = новый ByteArrayOutputStream (); буфер байт[] = новый байт[1024]; число байтовRead; while ((bytesRead = inputStream.read(buffer)) != -1) { byteArrayOutputStream.write(буфер, 0, bytesRead); } inputStream.close(); вернуть byteArrayOutputStream.toByteArray(); } еще { Toast.makeText(this, «Ошибка отмены входа в систему», Toast.LENGTH_SHORT).show(); } } catch (IOException e) { е.printStackTrace(); Toast.makeText(this, «Ошибка преобразования изображения в байты», Toast.LENGTH_SHORT).show(); } вернуть ноль; } Private void agregarReceta (Номер строки, Ингредиенты строки, Инструкции по строке, byte[] imagenBytes, строковая категория){ если (номбре.isEmpty()) { Toast.makeText(this, "Номер письма не может быть пустым", Toast.LENGTH_SHORT).show(); возвращаться; } пытаться { int idCategoria = dao.obtenerIdCategoria(категория); если (idCategoria != -1) { dao.insertarReceta(idCategoria, idUsuario, номер, ингредиенты, инструкции, imagenBytes); Toast.makeText(this, "La receta ha sido subida con éxito", Toast.LENGTH_SHORT).show(); } еще { Toast.makeText(this, «Категория без изменений в базе данных», Toast.LENGTH_SHORT).show(); } } catch (Исключение е) { е.printStackTrace(); Toast.makeText(this, «Ошибка при получении сообщения», Toast.LENGTH_SHORT).show(); } } } Пыталась без разрешения, но в поле img базы данных установлено значение null
Мобильная версия