dir.by  
  Поиск  
Компьютер, программы
Android, Google Play телефон, планшет (пишем приложение, игру)
Kotlin приложение (для Android телефона) в Android Studio
 Android Kotlin выбираем фото из галереи и рисуем в приложении | Android Studio | Kotlin ... 
посмотрели 6126 раз
обновлено: 11 апреля 2024
Я написал приложение в котором есть кнопка  Load photo from Gallery  и при нажатии я вызываю стандартную фунциональность чтобы выбирать фото из Галереи:


 


я нажмаю на кнопку  Load photo from Gallery :






 

Система Android показывает папку с фото
Я выбираю фото:





 

Мое приложение получает путь к фото
и отображает выбранное фото:




Шаг 1. Создаем новый проект
Шаг 2. Поменяем код в файле MainActivity.kt
Цвет          означает, что добавлен новый код.
  Файл MainActivity.kt
package com.example.androidkotlinapp1

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import android.content.Intent
import android.content.Intent.ACTION_OPEN_DOCUMENT
import android.net.Uri
import android.widget.Button
import android.widget.ImageView


class MainActivity : AppCompatActivity() {

     val MY_REQUEST_CODE1 = 100

     override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          setContentView(R.layout.activity_main)

          val myButton = findViewById(R.id.button1) as Button

          myButton.setOnClickListener {
               val intent = Intent(ACTION_OPEN_DOCUMENT)
               intent.addCategory(Intent.CATEGORY_OPENABLE)
               intent.type = "*/*"
               intent.putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("image/*", "video/*"))
               startActivityForResult(intent, MY_REQUEST_CODE1);
          }

     }

     // I override system function
     override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
          super.onActivityResult(requestCode, resultCode, data)

          if (resultCode == RESULT_OK && requestCode == MY_REQUEST_CODE1) {

               val uriFilePath_to_gallery = data?.data
               show_URI_in_ImageView(uriFilePath_to_gallery)

          }
     }


     // my function for image view
     fun show_URI_in_ImageView(uri: Uri?)
     {
          val myImageView = findViewById(R.id.imageView1) as ImageView
          myImageView.setImageURI(uri)
     }

}
Шаг 2. Поменяем код в файле activity_main.xml
В файл activity_main.xml добавим графические элементы:
LinearLayout
это слой в котором элементы отображаются друг за другом по вертикали или горизонтали (у меня по вертикали потому что установлен параметр android:orientation="vertical)
Button
Это кнопка
ImageView
это для отображения картинки
Цвет          означает, что добавлен новый код.
  Xml     Файл activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     tools:context=".MainActivity">

     <LinearLayout
 
         android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">

          <Button
 
              android:id="@+id/button1"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:backgroundTint="#A0A000"
               android:textColor="#000000"
               android:text="Load photo from Gallery" />

          <ImageView
 
              android:id="@+id/imageView1"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               tools:srcCompat="@tools:sample/avatars" />
     </LinearLayout>


</androidx.constraintlayout.widget.ConstraintLayout>
Объяснение
Интересно, какой путь увидим при выброре фото из галереи
 
При выброре фото из галереи мы увидим uri:
content://com.android.providers.media.documents/document/image%3A16
 
Вопрос: Как получить путь к файлу из этого uri?
Ответ: Этот uri, был сгенерирован системным Provider. Преобразовывать uri в путь к файлу я бы не советовал, потому что нет гарантий что всегда будет работать. Потому что на файл могут быть выделены только временные разрешения системой.

Проблема! Работать с uri из галереи мне не очень удобно. Я когда сохраняю uri в базу данных в проекте на работе, то потом этот uri не всегда работает (через несколько дней) - картинка по этому uri не отображается.
Решение:
  Шаг 1. Я создаю пустой файл внутри папки моего приложения (есть функция getExternalFilesDir в Kotlin).
  Шаг 2. Читаю содержимое (content) из uri галереи и сохраняю в мой пустой файл.
  Шаг 3. Получаю uri по месту нахождения моего файла
Скачать пример:
Изменения 1
  Создал новый файл MyFileUtils.kt
package com.example.androidkotlinapp1

import android.content.ContentResolver
import android.content.Context
import android.net.Uri
import android.webkit.MimeTypeMap
import androidx.core.content.FileProvider
import java.io.File
import java.io.InputStream

class MyFileUtils {

     fun copyUriContentToFileInsideApp(context: Context, uri: Uri, filenameWithoutExtension: String): Uri?
     {
          val fileExtension = getFileExtensionFromUri(context, uri);
          val folderApplication = context.getExternalFilesDir(android.os.Environment.DIRECTORY_PICTURES)
          val fileDest = File(folderApplication, filenameWithoutExtension + '.' + fileExtension)

          val uriDest = FileProvider.getUriForFile(
               context, "${BuildConfig.APPLICATION_ID}.fileprovider", fileDest
          )

          // get stream by uri
          val streamSource = context.contentResolver.openInputStream(uri)

          // store source stream to fileDest
          if (fileDest!=null && streamSource!=null)
          {
               streamSource.use { input ->
                    fileDest.outputStream().use { output ->
                         input.copyTo(output)
                         return uriDest
                    }
               }
          }
          return null
     }

     private fun getFileExtensionFromUri(context: Context, uri:Uri): String? {
          return if (uri.scheme == ContentResolver.SCHEME_CONTENT) {
               val mime = MimeTypeMap.getSingleton()
               mime.getExtensionFromMimeType(context.contentResolver.getType(uri))
          } else {
               MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(File(uri.path)).toString())
          }
     }
}
Изменения 2
Создал новый файл внутри папки:
D:\AndroidKotlinApp1
    app
       src
          main
             res
                xml
  Файл file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths>
     <external-path
 
         name="pictures"
          path="Android/data/com.example.androidkotlinapp1/files/Pictures" />
     <external-path
 
         name="music"
          path="Android/data/com.example.androidkotlinapp1/files/Music" />
     <external-path
 
         name="docs"
          path="Android/data/com.example.androidkotlinapp1/files/Documents" />
     <external-path
 
         name="pdf"
          path="." />
</paths>
Изменения 3
  Файл AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools">

     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
     <uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
     <uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>


     <application
 
         android:allowBackup="true"
          android:dataExtractionRules="@xml/data_extraction_rules"
          android:fullBackupContent="@xml/backup_rules"
          android:icon="@mipmap/ic_launcher"
          android:label="@string/app_name"
          android:supportsRtl="true"
          android:theme="@style/Theme.AndroidKotlinApp1"
          tools:targetApi="31">
          <activity
 
              android:name=".MainActivity"
               android:exported="true">
               <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
               </intent-filter>
          </activity>

          <provider
 
              android:name="androidx.core.content.FileProvider"
               android:authorities="${applicationId}.fileprovider"
               android:exported="false"
               android:grantUriPermissions="true">
               <meta-data
 
                   android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/file_paths" />
          </provider>


     </application>

</manifest>
Изменения 4
  Файл MainActivity.kt
package com.example.androidkotlinapp1

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.content.Intent
import android.content.Intent.ACTION_OPEN_DOCUMENT
import android.net.Uri
import android.widget.Button
import android.widget.ImageView
import androidx.core.content.ContentProviderCompat.requireContext

class MainActivity : AppCompatActivity() {
     val MY_REQUEST_CODE1 = 100

     override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          setContentView(R.layout.activity_main)

          val myButton = findViewById(R.id.button1) as Button

          myButton.setOnClickListener {
               val intent = Intent(ACTION_OPEN_DOCUMENT)
               intent.addCategory(Intent.CATEGORY_OPENABLE)
               intent.type = "*/*"
               intent.putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("image/*", "video/*"))
               startActivityForResult(intent, MY_REQUEST_CODE1);
          }
     }

     // I override system function
     override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
          super.onActivityResult(requestCode, resultCode, data)

          if (resultCode == RESULT_OK && requestCode == MY_REQUEST_CODE1) {

               val uriContent_selected_from_gallery = data?.data

               val filenameWithoutExtension = "my_picture1"
               val newUri = MyFileUtils().copyUriContentToFileInsideApp(baseContext!!, uriContent_selected_from_gallery!!, filenameWithoutExtension);

               show_URI_in_ImageView(newUri)


          }
     }

     // my function for image view
     fun show_URI_in_ImageView(uriContent: Uri?)
     {
          val myImageView = findViewById(R.id.imageView1) as ImageView
          myImageView.setImageURI(uriContent)
     }
}
Запустим программу
Увидим новый uri для картинки:
content://com.example.androidkotlinapp1.fileprovider/pictures/my_picture1.jpg
 
← Предыдущая тема
Android Kotlin приложение делает фото на камеру и рисует в приложении | Android Studio | Kotlin
 
Следующая тема →
getExternalFilesDir - функция, которая возвращает полный путь к внешнему каталогу, в который наше приложение может помещать постоянные файлы | Android Studio, Kotlin
 
Ваши Отзывы ... комментарии ...
   
Вашe имя
Ваш комментарий (www ссылки может добавлять только залогиненный пользователь)

Экскурсии по Москве Экскурсии по Москве: пешеходные, автобусные и речные прогулки на любой вкус
  Объявления  
  Объявления  
 
Что такое операционная система Android? Какие номера версий были в Android
Что такое ARM процессоры? | Android
Что такое AndroidX?
Java приложение (для Android телефона) в Android Studio
Почему Android приложения пишутся на Java?
Скачать и установить Android Studio для написания программ для Android телефонов на языке Java, Kotlin
Открываем Android Studio на компьютере (Windows 10)
Создаем новый проект на Java с одной простой Activity в Android Studio (пишем программу для Android телефонов, планшетов) в Windows 10
Пример "Устанавливаем текст в TextView" через Java код | Android, Java приложение
Пример "Отправляю http (web api) запрос на сайт и ответ отображаю в TextView" | Android, Java приложение
Компиляция и запуск приложения в Android Studio на компьютере (Windows) в режиме эмулятора Android Device
Запуск приложения Android Studio в отладке на компьютере (Windows) в режиме эмулятора Android Device
Ошибка "error while waiting for device: the emulator process for ..... has terminated" при запуске приложения в Android Studio на компьютере (Windows) в режиме эмулятора Android Device
Ошибка "Error while waiting for device: Illegal char <*> at index 0: *.lock ..." при запуске приложения в Android Studio
Ошибка "AVD is already running ..." при запуске приложения в Android Studio
Ошибка "CMake "3.18.1" was not found in SDK, PATH, or by cmake.dir property" при компиляции проекта в Android Studio
Ошибка "Execution failed for task ":app:compressDebugAssets" при компиляции проекта в Android Studio
Все ошибки при запуске Android приложения
Что такое Android SDK (копия операционной системы Android)? Инсталлирование Android SDK 8.1 в Android Studio ...
Создаем Android виртуальное устройство в Android Studio
Установить HAXM
Activity в Android
Kotlin приложение (для Android телефона) в Android Studio
Скачать и установить Android Studio для написания программ для Android телефонов на языке Java, Kotlin
Создаем новый проект "Empty Views Activity" на Kotlin в Android Studio (пишем программу для Android телефонов, планшетов) в Windows 10
Компиляция и запуск Kotlin приложения в Android Studio на компьютере (Windows) в режиме эмулятора Android Device
Запуск Kotlin приложения в Android Studio в отладке на компьютере (Windows) в режиме эмулятора Android Device
Запуск и отладка Kotlin Android Studio приложения на моем телефоне через USB
Долгое ожидание при запуске Kotlin Android приложения. Вижу сообщение: "I/zygote:Waiting for a blocking GC ProfileSaver"
Создаем Android проект добавляем TextView и показываем значение на телефоне | Android телефон, Android Studio, Kotlin, Windows 10
Копирование данных в классе и объекта. Используем аттрибут @Parcelize и интрефейс Parcelable. | Kotlin | Android Studio
Ошибка "Class is not abstract and does not implement abstract member public abstract fun describeContents(): Int defined in android.os.Parcelable" | Kotlin | Android Studio | @Parcelize | Parcelable
Показываем окно с 2-мя кнопками: yes, no и не надо добавлять никаких resource, layout | Я вызываю функцию AlertDialog в Kotlin | Android Studio
Android Kotlin приложение делает фото на камеру и рисует в приложении | Android Studio | Kotlin
Android Kotlin выбираем фото из галереи и рисуем в приложении | Android Studio | Kotlin ...
getExternalFilesDir - функция, которая возвращает полный путь к внешнему каталогу, в который наше приложение может помещать постоянные файлы | Android Studio, Kotlin
getFilesDir - функция, которая возвращает полный путь к каталогу, в который наше приложение может поместить файлы | Android Studio, Kotlin
Как работать с файлами, media в Android? Что такое content Uri и file path. Отличие getExternalFilesDir и getFilesDir ... | Android Studio, Kotlin
Как сделать переменную в build.gradle файле и передать ее в манифест файл AndroidManifest.xml | Android Studio | Kotlin
Как сделать переменную в build.gradle файле и передать ее в Kotlin файл | Android Studio | Kotlin
Moshi (Преобразование текста json в объект класса) | десериализация на языке Kotlin | Android Studio
Moshi (Преобразование массива json в список объектов) | десериализация на языке Kotlin | Android Studio
Ошибка "Failed to find the generated JsonAdapter class for class com.example.androidkotlinapp1.MyBook" | Exception | Kotlin | Moshi | Android Studio
Ошибка "A problem occurred evaluating project ':app'. Caused by: CustomMessageMissingMethodException: Could not find method kapt() for arguments [com.squareup.moshi:moshi-kotlin-codegen:1.14.0]" | При компиляции Kotlin, Moshi проекта в Android Studio
Jetpack приложение (для Android телефона) в Android Studio | Kotlin
Что такое Jetpack для Android?
Создаем новый проект "Jetpack Compose" на Kotlin в Android Studio (пишем программу для Android телефонов, планшетов) в Windows 10
Ошибка компиляции "Dependency 'androidx.core:core-ktx:1.17.0' requires Android Gradle plugin 8.9.1 or higher" | Jetpack | Kotlin | Android Studio
C++ игра (для Android телефона) в Android Studio | Android NDK, OpenGL ES
Что такое Android NDK для Android телефона? Это C++ библиотека для Android телефона.
Android С++ NDK руководство для начинающих (книга)
Что такое Android OpenGL ES для Android телефона? Это C++ графическая библиотека для Android телефона.
Создаем проект "Android Native C++ Game" для телефона | Android Studio, Android NDK, OpenGL ES, C++
Рисование озера по точкам для 2D игры
Рисую вражеский самолетик как векторная графика в Adobe Illustrator. Беру координаты точек из Adobe Illustrator и добавляю в мою 2D игру на C++ OpenGL
Компиляция и запуск "Android Native C++ Game" в Android Studio на компьютере(Windows) в режиме эмулятора Android Device
Ошибка "[CXX1405] error when building with cmake using CMakeLists.txt: C build system [configure] failed while executing cmake.exe" при компиляции Android Native C++ приложения в Android Studio на компьютере (Windows)
Ошибка "ninja: error: rebuilding 'build.ninja': subcommand failed" при компиляции Android Native C++ приложения в Android Studio на компьютере (Windows)
Рисование треугольника с закрашиванием внутри в "Android Native C++ Game" для телефона | Android Studio, Android NDK, OpenGL ES v1, C++
Загрузка bmp файла из Assets и рисование текстур в "Android Native C++ Game" для телефона | Android Studio, Android NDK, OpenGL ES v2 (shader), C++
Как получить файл bmp, расположенный в Assets внутри файла apk? | Android Studio, NDK, C++
Как использовать альфа-прозрачность при отображении текстуры с помощью OpenGL? | Android Studio, OpenGL ES, NDK, C++
Почему glTexImage2D возвращает ошибку с кодом 1280 ? | Android Studio, OpenGL ES, NDK, C++
Что такое cpp и h файлы в C++? | Android Studio, NDK, C++
Как создать новый файл h и добавить в проект android NDK C++? | Android Studio, NDK, C++
Как создать новый файл cpp и добавить в проект android NDK C++? | Android Studio, NDK, C++, CMakeLists.txt
dynamic_cast в C++ (преобразование указателя в другой тип и проверка валидности во время выполнения) | Android Studio, NDK, C++
std::map<Key, Value> это набор ключей и значений в C++. | Android Studio, NDK, C++
Передаем функцию как параметр в функцию (callback) | C++ | Android Studio, NDK, C++
Как найти событие при повороте дисплея (изменении ориентации) в телефоне Android | Android Studio, NDK, C++
Как обрабатывать события в телефоне Android (создание/завершение события окна, установка фокуса, потеря фокуса, касание в телефоне) | Android Studio, NDK, C++
Создаем подписанный apk файл в Android Studio | Android NDK, OpenGL ES
Google Play Console (для разработчика)
Создаем Google Play account разработчика | Google Play Console
Разработчику в Google Play Console требуется подтвердить личность | Google Play Console
Разработчик в Google Play Console должен подтвердить аккаунт разработчика | Google Play Console
Учетная запись разработчика не используется | Учетная запись разработчика находится под угрозой закрытия | Google Play Console
Скомпилируйте приложение и отправьте его в продакшн в Google Play Console | Мое приложение в Google Play Console
Policy status "Invalid Privacy policy" | Provide link to a valid privacy policy page | Мое приложение в Google Play Console
Policy status "App must target Android 15 (API level 35) or higher" | Status "You won't be able to release app updates" | Мое приложение в Google Play Console
Policy status "App must target Android 14 (API level 34) or higher" | Status "You won't be able to release app updates" | Мое приложение в Google Play Console
Policy app content "Remove Photo and video permissions permission or submit declaration" | Мое приложение в Google Play Console
Создаем приложение в Google Play Console (в опции выбираю что это будет игра) | Моя игра в Google Play Console
Важные параметры: package, applicationId, versionCode, versionName, android:label (в AndroidManifest.xml, build.gradle) чтобы создать тестовую версию для Google Play Console | Моя игра в Google Play Console
Создаем подписанный .aab файл в Android Studio | Моя игра в Google Play Console
Компилируем игру и присылаем на внутреннее тестирование в Google Play Console | Моя игра в Google Play Console
Google автоматически запустил тесты и сделал картинки, отчет как запускается игра на разных марках телефонах | Моя игра в Google Play Console
Как задать Google Play Developer Console вопрос в поддержку?
Google Play Developer Console support feedback
Темы про Google Play Billing & in-app purchase | Google Play Console
Можно использовать (интегрировать) платежи в моей Google игре если я разработчик из Беларуси? | Монетизация в Google Play Console
Как изменить язык Google Play Console? | Google Chrome
Как изменить страну в платежном профиле? | Google Play Console
Как в Google Play посмотреть(открыть) платежную страницу? | Google Play Console

  Ваши вопросы присылайте по почте: info@dir.by  
Яндекс.Метрика