Как поделиться изображением из нашего приложения в другом, используя намерения и Котлин?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как поделиться изображением из нашего приложения в другом, используя намерения и Котлин?

Сообщение Anonymous »


Я пытаюсь поделиться образцом изображения из моего приложения с другим человеком с помощью Whatsapp/или другого приложения для обмена фотографиями. Но я не знаю, почему он не делится. Я не знаю, где в моем коде я делаю неправильно. Пожалуйста, помогите мне решить проблему. Я использую Intent, чтобы поделиться изображением.

Мои опробованные файлы кода следующие: >
[*]AndroidMenifest.xml
[*]путь_файла.xml [*]MainActivity.kt пакет com.example.imageshare импортировать android.content.ActivityNotFoundException импортировать android.content.Intent импортировать android.content.pm.PackageManager импортировать android.net.Uri импортировать android.os.Bundle импортировать android.os.Environment импортировать android.util.Log импортировать androidx.activity.ComponentActivity импортировать androidx.activity.compose.setContent импортировать androidx.compose.foundation.layout.Arrangement импортировать androidx.compose.foundation.layout.Column импортировать androidx.compose.foundation.layout.fillMaxSize импортировать androidx.compose.material3.Button импортировать androidx.compose.material3.MaterialTheme импортировать androidx.compose.material3.Surface импортировать androidx.compose.material3.Text импортировать androidx.compose.runtime.Composable импортировать androidx.compose.ui.Alignment импортировать androidx.compose.ui.Modifier импортировать androidx.compose.ui.tooling.preview.Preview импортировать androidx.core.app.ActivityCompat импортировать androidx.core.app.ShareCompat импортировать androidx.core.content.ContextCompat импортировать androidx.core.content.FileProvider импортировать com.example.imageshare.ui.theme.ImageShareTheme импортировать java.io.File класс MainActivity : ComponentActivity() { Private val MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 123 // Вы можете использовать любое целочисленное значение переопределить fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { Основное содержание() } // Проверяем, не предоставлено ли разрешение если (ContextCompat.checkSelfPermission( этот, android.Manifest.permission.READ_EXTERNAL_STORAGE ) != PackageManager.PERMISSION_GRANTED ) { // Запрашиваем разрешение ActivityCompat.requestPermissions( этот, arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE ) } еще { // Разрешение уже предоставлено, продолжаем операцию setContent { Основное содержание() } } } переопределить удовольствие onRequestPermissionsResult( Код запроса: Int, разрешения: Array, грантРезультаты: ИнтАррай ) { super.onRequestPermissionsResult (код запроса, разрешения, грантрезультаты) когда (код запроса) { MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE -> { если (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Разрешение получено, продолжаем операцию setContent { Основное содержание() } } еще { // Разрешение отклонено, обрабатываем соответственно // Вы можете показать сообщение или предпринять соответствующие действия } } // Обработка других разрешений, если необходимо } } @Композитный весело MainContent() { // Код пользовательского интерфейса с кнопкой и выполнением FileOperation Поверхность( модификатор = Модификатор.fillMaxSize(), цвет = MaterialTheme.colorScheme.background ) { Столбец( модификатор = Модификатор.fillMaxSize(), вертикальноеРасположение = Расположение.Центр, HorizontalAlignment = Alignment.CenterHorizontally ) { выполнитьФайлОперация() } } } @Композитный частное развлечение PerformFileOperation() { // Код, предполагающий взаимодействие с внешним хранилищем // Например, проверка существования и читаемости файла val imageName = "SolarSystem.jpg" val imageFile = File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), imageName) Log.d("MainActivity_Response", "Изображение существует? ${imageFile.exists()}") Log.d("MainActivity_Response", "Изображение можно прочитать? ${imageFile.canRead()}") Log.d("MainActivity_Response", "Абсолютный путь — ${imageFile.absolutePath}") Log.d("MainActivity_Response", "Еще одно значение — ${getExternalFilesDir(Environment.DIRECTORY_PICTURES)}") // Создаем Uri из файла с помощью FileProvider val imageUri: Uri = FileProvider.getUriForFile( Контекст приложения, "com.example.imageshare.MyFileProvider", файл изображения ) // Код пользовательского интерфейса с кнопкой Кнопка( onClick = { // Намерение(Intent.ACTION_SEND).apply { // тип = "изображение/jpeg" // putExtra(Intent.EXTRA_STREAM, imageUri) // startActivity(это) // } ShareCompat.IntentBuilder(это) .setType("изображение/jpeg") .addStream(imageUri) .setChooserTitle("Поделиться изображением") .setSubject("Общее изображение") .startChooser() } ) { Текст(текст = "Отправить") } } } [*]MyFileProvider.kt пакет com.example.imageshare импортировать androidx.core.content.FileProvider класс MyFileProvider : FileProvider(R.xml.file_path) { } Отредактировано 1 Что в редактировании?
[*]
Я делюсь некоторыми журналами, которые я создал из файла MainActivity.Kt. а. «2024-03-01 06:57:12.905 3628-3628 MainActivity_Response com.example.imageshare D Изображение существует? false " б. «2024-03-01 06:57:12.905 3628-3628 MainActivity_Response com.example.imageshare D Изображение можно прочитать? false " в. «2024-03-01 06:57:12.905 3628-3628 MainActivity_Response com.example.imageshare D Абсолютный путь: /storage/emulated/0/Android/data/com.example.imageshare/files/Pictures/SolarSystem.jpg " д. «2024-03-01 06:57:12.907 3628-3628 MainActivity_Response com.example.imageshare D Еще одно значение — /storage/emulated/0/Android/data/com.example.imageshare/files/Pictures "
[*]
Я тоже использовал чатгпт, чтобы решить эту проблему. И он попросил отредактировать (что я отредактировал) некоторые вещи -> а. Поскольку первый и второй журналы, как видите, дают мне ложное значение. Поэтому мне предложили поместить изображение в файловую систему Android с помощью этих двух команд. "adbshell mkdir -p /sdcard/Android/data/com.example.imageshare/files/Pictures/ " "adb push C:\Users\Pcc\Desktop\SolarSystem.jpg/sdcard/ " "оболочка adb mv /sdcard/SolarSystem.jpg /sdcard/Android/data/com.example.imageshare/files/Pictures/ " б. Он также предоставил отредактированный код для управления разрешениями (я соответственно обновил здесь свои файлы кода). в. А также небольшие подергивания.

Результаты, которые я получил после этих изменений->
[*]Один-два раза после соответствующего редактирования файла кода я начинал получать положительный результат. Даже один-два раза я успешно возможность поделиться изображением в WhatsApp и на других платформах. Значения для параметра «Изображение существует?» и «Изображение можно найти?» log также начал возвращать true. Но, как вы все знаете, «любопытство убивает кота». После того, как мое приложение заработало идеально, поскольку я внес много изменений в свой код и я очень новичок в этих концепциях, я попытался понять код, внося небольшие изменения, такие как закомментирование некоторых частей или, возможно, изменение какого-то подхода. А затем, вернувшись к исходному правильному коду (возможно), вот оно снова, МОЕ ПРИЛОЖЕНИЕ СНОВА НАЧАЛО ПОКАЗАТЬ ТЕ ЖЕ РЕЗУЛЬТАТЫ, КАК ОНО ПОКАЗЫВАЛО РАНЬШЕ. В WhatsApp пишет: «Формат файла не поддерживается». И я также поделился с вами журналами. Я смиренно прошу вас посетить мой отредактированный код.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»