Разрешение пользователя на доступ к мультимедиа в студии Android ⇐ Android
-
Гость
Разрешение пользователя на доступ к мультимедиа в студии Android
создание этого приложения в студии Android с использованием языка Java, это своего рода клон Instagram, для публикации изображений у меня есть эта конкретная публикация, в которой я пытаюсь реализовать доступ к галерее пользователя для выбора изображения, но я не могу сделайте это... я следил за руководством на YouTube, но оно довольно старое, поэтому немногие функции и все устарели, поэтому я пробовал много вещей, но не смог решить свою ошибку. Также есть несколько устаревших функций, таких как «continuationWithTask», для которых я не могу найти альтернативы
Я следовал этой документации по доступу к разрешениям пользователя с использованием разрешений медиа-хранилища. Я тоже это сделал, но, кажется, я делаю что-то не так, и я не могу понять
Итак, вот мое разрешение манифеста и мой код активности публикации
-> разрешение манифеста
-> Java-код
пакет com.example.lively; импортировать androidx.activity.result.ActivityResultLauncher; импортировать androidx.activity.result.contract.ActivityResultContracts; импортировать androidx.annotation.NonNull; импортировать androidx.annotation.Nullable; импортировать androidx.annotation.RequiresExtension; импортировать androidx.appcompat.app.AlertDialog; импортировать androidx.appcompat.app.AppCompatActivity; импортировать androidx.core.app.ActivityCompat; импортировать android.Manifest; импортировать android.content.ContentResolver; импортировать android.content.Intent; импортировать android.content.pm.PackageManager; импортировать android.net.Uri; импортировать android.os.Build; импортировать android.os.Bundle; импортировать android.os.ext.SdkExtensions; импортировать android.provider.MediaStore; импортировать android.provider.Settings; импортировать android.webkit.MimeTypeMap; импортировать android.widget.EditText; импортировать android.widget.ImageView; импортировать android.widget.ProgressBar; импортировать android.widget.TextView; импортировать android.widget.Toast; импортировать com.google.firebase.storage.StorageTask; импортировать com.google.android.gms.tasks.OnCompleteListener; импортировать com.google.firebase.auth.FirebaseAuth; импортировать com.google.firebase.database.DatabaseReference; импортировать com.google.firebase.database.FirebaseDatabase; импортировать com.google.firebase.storage.FirebaseStorage; импортировать com.google.firebase.storage.StorageReference; импортировать java.util.HashMap; импортировать java.util.Objects; импортировать java.util.UUID; публичный класс PostActivity расширяет AppCompatActivity { частная статическая конечная строка PERMISSION_READ_MEDIA = Manifest.permission.READ_MEDIA_IMAGES; Ури imageUri; Строка myUrl = ноль; StorageTask uploadTask; StorageReference StorageReference; ImageView закрыть, imageAdded; Сообщение TextView; Описание EditText; частный ActivityResultLauncher mImage; частный статический окончательный интервал PICK_IMAGE_REQUEST = 1; общественный ProgressBar ProgressBar = findViewById (R.id.progressBar); @Override protected void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); setContentView(R.layout.activity_post); закрыть = findViewById(R.id.close); imageAdded = findViewById(R.id.imageAdded); сообщение = findViewById(R.id.post); описание = findViewById(R.id.description); StorageReference = FirebaseStorage.getInstance().getReference("posts"); close.setOnClickListener(v -> { startActivity(новое намерение(PostActivity.this, MainActivity.class)); заканчивать(); }); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { imageAdded.setOnClickListener(v -> PickImage()); } post.setOnClickListener(v -> { если (imageUri != ноль) { загрузить изображение(); } еще { Toast.makeText(this, «Изображение не выбрано», Toast.LENGTH_SHORT).show(); } }); openFileChooser(); } частный недействительный requestRuntimePermission () { если (ActivityCompat.checkSelfPermission(это, PERMISSION_READ_MEDIA) == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, «Разрешение предоставлено», Toast.LENGTH_SHORT).show(); } Еще если (ActivityCompat.shouldShowRequestPermissionRationale(this, PERMISSION_READ_MEDIA)) { AlertDialog.Builder builder = новый AlertDialog.Builder(this); builder.setMessage("Доступ к изображениям") .setTitle("Требуется разрешение") .setCancelable(ложь) .setPositiveButton("ОК", (диалог, который) -> { ActivityCompat.requestPermissions(PostActivity.this, новая строка[]{PERMISSION_READ_MEDIA}, PICK_IMAGE_REQUEST); диалог.отклонить(); }) .setNegativeButton("Отмена", ((диалог, который) -> диалог.отклонить())); строитель.шоу(); } еще { ActivityCompat.requestPermissions(это, новая строка[]{PERMISSION_READ_MEDIA}, PICK_IMAGE_REQUEST); } } @Override public void onRequestPermissionsResult(int requestCode, разрешения @NonNull String[], @NonNull int[]grantResults) { super.onRequestPermissionsResult(requestCode, разрешения, GrantResults); если (requestCode == PICK_IMAGE_REQUEST) { если (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, «Разрешение предоставлено», Toast.LENGTH_SHORT).show(); } else if (!ActivityCompat.shouldShowRequestPermissionRationale(this, PERMISSION_READ_MEDIA)) { AlertDialog.Builder builder = новый AlertDialog.Builder(this); builder.setMessage("Разрешить из настроек") .setTitle("Требуется разрешение") .setCancelable(ложь) .setNegativeButton("Отмена", ((диалог, который) -> диалог.отклонить())) .setPositiveButton("Настройки", (диалог, который) -> { Намерение намерение = новое намерение (Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); намерение.setData(uri); startActivity (намерение); диалог.отклонить(); }); строитель.шоу(); } еще { requestRuntimePermission(); } } } частная пустота openFileChooser () { mImage = RegisterForActivityResult( новый ActivityResultContracts.GetContent(), o -> imageAdded.setImageURI(o) ); } protected void onActivityResult(int requestCode, int resultCode, данные намерения @Nullable) { super.onActivityResult(requestCode, resultCode, data); если (код запроса == PICK_IMAGE_REQUEST && код результата == RESULT_OK && данные != null && data.getData() != null) { imageUri = data.getData(); imageAdded.setImageURI(imageUri); } } @RequiresExtension(расширение = Build.VERSION_CODES.R, версия = 2) частный недействительный PickImage () { Намерение намерение = новое намерение (MediaStore.ACTION_PICK_IMAGES); mImage.launch(String.valueOf(намерение)); requestRuntimePermission(); } частная строка getFileExtension (Uri uri) { ContentResolver contentResolver = getContentResolver(); MimeTypeMap mime = MimeTypeMap.getSingleton(); return mime.getExtensionFromMimeType(contentResolver.getType(uri)); } частная пустота uploadImage() { ProgressBar.setTag("Публикация"); StorageReference fileReference = StorageReference.child(UUID.randomUUID().toString() + "." + getFileExtension(imageUri)); uploadTask = fileReference.putFile(imageUri); uploadTask.continueWithTask(задача -> { если (!task.isSuccessful()) { throw Objects.requireNonNull(task.getException()); } вернуть fileReference.getDownloadUrl(); }).addOnCompleteListener((OnCompleteListener) задача -> { если (task.isSuccessful()) { Uri downloadUri = Task.getResult(); myUrl = downloadUri.toString(); Ссылка на DatabaseReference = FirebaseDatabase.getInstance().getReference("Сообщения"); Строка postId = reference.push().getKey(); HashMap hashMap = new HashMap(); hashMap.put("postid", postId); hashMap.put("postimage", myUrl); hashMap.put("описание",description.getText().toString()); hashMap.put("издатель", Objects.requireNonNull(FirebaseAuth.getInstance().getCurrentUser()).getUid()); утверждать postId != null; reference.child(postId).setValue(hashMap); ProgressBar.clearAnimation(); startActivity(новое намерение(PostActivity.this, MainActivity.class)); заканчивать(); } еще { Toast.makeText(PostActivity.this, «Ошибка», Toast.LENGTH_SHORT).show(); } }).addOnFailureListener(e -> Toast.makeText(PostActivity.this, " " + e.getMessage(), Toast.LENGTH_SHORT).show()); } } вы также можете посмотреть весь мой проект на github [https://github.com/riloveCP/lively]
версия для Android
создание этого приложения в студии Android с использованием языка Java, это своего рода клон Instagram, для публикации изображений у меня есть эта конкретная публикация, в которой я пытаюсь реализовать доступ к галерее пользователя для выбора изображения, но я не могу сделайте это... я следил за руководством на YouTube, но оно довольно старое, поэтому немногие функции и все устарели, поэтому я пробовал много вещей, но не смог решить свою ошибку. Также есть несколько устаревших функций, таких как «continuationWithTask», для которых я не могу найти альтернативы
Я следовал этой документации по доступу к разрешениям пользователя с использованием разрешений медиа-хранилища. Я тоже это сделал, но, кажется, я делаю что-то не так, и я не могу понять
Итак, вот мое разрешение манифеста и мой код активности публикации
-> разрешение манифеста
-> Java-код
пакет com.example.lively; импортировать androidx.activity.result.ActivityResultLauncher; импортировать androidx.activity.result.contract.ActivityResultContracts; импортировать androidx.annotation.NonNull; импортировать androidx.annotation.Nullable; импортировать androidx.annotation.RequiresExtension; импортировать androidx.appcompat.app.AlertDialog; импортировать androidx.appcompat.app.AppCompatActivity; импортировать androidx.core.app.ActivityCompat; импортировать android.Manifest; импортировать android.content.ContentResolver; импортировать android.content.Intent; импортировать android.content.pm.PackageManager; импортировать android.net.Uri; импортировать android.os.Build; импортировать android.os.Bundle; импортировать android.os.ext.SdkExtensions; импортировать android.provider.MediaStore; импортировать android.provider.Settings; импортировать android.webkit.MimeTypeMap; импортировать android.widget.EditText; импортировать android.widget.ImageView; импортировать android.widget.ProgressBar; импортировать android.widget.TextView; импортировать android.widget.Toast; импортировать com.google.firebase.storage.StorageTask; импортировать com.google.android.gms.tasks.OnCompleteListener; импортировать com.google.firebase.auth.FirebaseAuth; импортировать com.google.firebase.database.DatabaseReference; импортировать com.google.firebase.database.FirebaseDatabase; импортировать com.google.firebase.storage.FirebaseStorage; импортировать com.google.firebase.storage.StorageReference; импортировать java.util.HashMap; импортировать java.util.Objects; импортировать java.util.UUID; публичный класс PostActivity расширяет AppCompatActivity { частная статическая конечная строка PERMISSION_READ_MEDIA = Manifest.permission.READ_MEDIA_IMAGES; Ури imageUri; Строка myUrl = ноль; StorageTask uploadTask; StorageReference StorageReference; ImageView закрыть, imageAdded; Сообщение TextView; Описание EditText; частный ActivityResultLauncher mImage; частный статический окончательный интервал PICK_IMAGE_REQUEST = 1; общественный ProgressBar ProgressBar = findViewById (R.id.progressBar); @Override protected void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); setContentView(R.layout.activity_post); закрыть = findViewById(R.id.close); imageAdded = findViewById(R.id.imageAdded); сообщение = findViewById(R.id.post); описание = findViewById(R.id.description); StorageReference = FirebaseStorage.getInstance().getReference("posts"); close.setOnClickListener(v -> { startActivity(новое намерение(PostActivity.this, MainActivity.class)); заканчивать(); }); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && SdkExtensions.getExtensionVersion(Build.VERSION_CODES.R) >= 2) { imageAdded.setOnClickListener(v -> PickImage()); } post.setOnClickListener(v -> { если (imageUri != ноль) { загрузить изображение(); } еще { Toast.makeText(this, «Изображение не выбрано», Toast.LENGTH_SHORT).show(); } }); openFileChooser(); } частный недействительный requestRuntimePermission () { если (ActivityCompat.checkSelfPermission(это, PERMISSION_READ_MEDIA) == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, «Разрешение предоставлено», Toast.LENGTH_SHORT).show(); } Еще если (ActivityCompat.shouldShowRequestPermissionRationale(this, PERMISSION_READ_MEDIA)) { AlertDialog.Builder builder = новый AlertDialog.Builder(this); builder.setMessage("Доступ к изображениям") .setTitle("Требуется разрешение") .setCancelable(ложь) .setPositiveButton("ОК", (диалог, который) -> { ActivityCompat.requestPermissions(PostActivity.this, новая строка[]{PERMISSION_READ_MEDIA}, PICK_IMAGE_REQUEST); диалог.отклонить(); }) .setNegativeButton("Отмена", ((диалог, который) -> диалог.отклонить())); строитель.шоу(); } еще { ActivityCompat.requestPermissions(это, новая строка[]{PERMISSION_READ_MEDIA}, PICK_IMAGE_REQUEST); } } @Override public void onRequestPermissionsResult(int requestCode, разрешения @NonNull String[], @NonNull int[]grantResults) { super.onRequestPermissionsResult(requestCode, разрешения, GrantResults); если (requestCode == PICK_IMAGE_REQUEST) { если (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, «Разрешение предоставлено», Toast.LENGTH_SHORT).show(); } else if (!ActivityCompat.shouldShowRequestPermissionRationale(this, PERMISSION_READ_MEDIA)) { AlertDialog.Builder builder = новый AlertDialog.Builder(this); builder.setMessage("Разрешить из настроек") .setTitle("Требуется разрешение") .setCancelable(ложь) .setNegativeButton("Отмена", ((диалог, который) -> диалог.отклонить())) .setPositiveButton("Настройки", (диалог, который) -> { Намерение намерение = новое намерение (Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); намерение.setData(uri); startActivity (намерение); диалог.отклонить(); }); строитель.шоу(); } еще { requestRuntimePermission(); } } } частная пустота openFileChooser () { mImage = RegisterForActivityResult( новый ActivityResultContracts.GetContent(), o -> imageAdded.setImageURI(o) ); } protected void onActivityResult(int requestCode, int resultCode, данные намерения @Nullable) { super.onActivityResult(requestCode, resultCode, data); если (код запроса == PICK_IMAGE_REQUEST && код результата == RESULT_OK && данные != null && data.getData() != null) { imageUri = data.getData(); imageAdded.setImageURI(imageUri); } } @RequiresExtension(расширение = Build.VERSION_CODES.R, версия = 2) частный недействительный PickImage () { Намерение намерение = новое намерение (MediaStore.ACTION_PICK_IMAGES); mImage.launch(String.valueOf(намерение)); requestRuntimePermission(); } частная строка getFileExtension (Uri uri) { ContentResolver contentResolver = getContentResolver(); MimeTypeMap mime = MimeTypeMap.getSingleton(); return mime.getExtensionFromMimeType(contentResolver.getType(uri)); } частная пустота uploadImage() { ProgressBar.setTag("Публикация"); StorageReference fileReference = StorageReference.child(UUID.randomUUID().toString() + "." + getFileExtension(imageUri)); uploadTask = fileReference.putFile(imageUri); uploadTask.continueWithTask(задача -> { если (!task.isSuccessful()) { throw Objects.requireNonNull(task.getException()); } вернуть fileReference.getDownloadUrl(); }).addOnCompleteListener((OnCompleteListener) задача -> { если (task.isSuccessful()) { Uri downloadUri = Task.getResult(); myUrl = downloadUri.toString(); Ссылка на DatabaseReference = FirebaseDatabase.getInstance().getReference("Сообщения"); Строка postId = reference.push().getKey(); HashMap hashMap = new HashMap(); hashMap.put("postid", postId); hashMap.put("postimage", myUrl); hashMap.put("описание",description.getText().toString()); hashMap.put("издатель", Objects.requireNonNull(FirebaseAuth.getInstance().getCurrentUser()).getUid()); утверждать postId != null; reference.child(postId).setValue(hashMap); ProgressBar.clearAnimation(); startActivity(новое намерение(PostActivity.this, MainActivity.class)); заканчивать(); } еще { Toast.makeText(PostActivity.this, «Ошибка», Toast.LENGTH_SHORT).show(); } }).addOnFailureListener(e -> Toast.makeText(PostActivity.this, " " + e.getMessage(), Toast.LENGTH_SHORT).show()); } } вы также можете посмотреть весь мой проект на github [https://github.com/riloveCP/lively]
версия для Android
Мобильная версия