Как поделиться изображением из моего приложения для Android (Kotlin) в других приложениях? ⇐ Android
Как поделиться изображением из моего приложения для Android (Kotlin) в других приложениях?
Я пытаюсь разрешить пользователям обмениваться изображениями из моего приложения с другими приложениями (например, Whatsapp, Telegram, Gmail и т. д.).
Я использую Android Studio, и мое приложение написано на Kotlin.
Вот мой MainActivity.kt:
пакет com.example.example импортировать android.app.AlertDialog импортировать android.app.DownloadManager импортировать android.content.Context импортировать android.content.Intent импортировать android.graphics.Bitmap импортировать android.graphics.Canvas импортировать android.net.Uri импортировать android.os.Build импортировать android.os.Bundle импортировать android.os.Environment импортировать android.view.ContextMenu импортировать android.view.MenuItem импортировать android.view.View импортировать android.webkit.* импортировать android.widget.Toast импортировать androidx.activity.ComponentActivity импортировать androidx.core.content.FileProvider импортировать java.io.File импортировать java.io.FileOutputStream импортировать java.net.URL // Идентификатор OneSignal const val ONESIGNAL_APP_ID = "REAL_KEY_HERE" класс MainActivity : ComponentActivity() { частный lateinit var webView: WebView переопределить fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Инициализация OneSignal // (Здесь ваш существующий код OneSignal) setContentView (R.layout.activity_main) webView = findViewById(R.id.webView) // Настраиваем параметры WebView настроитьWebViewSettings() // Настраиваем WebViewClient setWebViewClient() // Настраиваем WebChromeClient для обработки загрузки файлов setWebChromeClient() // Загружаем исходный URL webView.loadUrl("https://www.example.com/Directory/AppHome.php") } личное развлечение configureWebViewSettings() { val webSettings: WebSettings = webView.settings // Включаем JavaScript в WebView webSettings.javaScriptEnabled = правда // Включаем кэширование webSettings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK // Включаем аппаратное ускорение if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { webView.setLayerType(View.LAYER_TYPE_HARDWARE, ноль) } еще { webView.setLayerType(View.LAYER_TYPE_SOFTWARE, ноль) } // Включаем асинхронную загрузку webSettings.blockNetworkImage = ложь // Отключаем доступ к файлам в WebView webSettings.allowFileAccess = ложь // Отключаем небезопасный контент (HTTP) webSettings.mixedContentMode = WebSettings.MIXED_CONTENT_NEVER_ALLOW // Включаем безопасный просмотр только на устройствах с SDK версии 27 или выше if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { webSettings.safeBrowsingEnabled = true } webSettings.setDisplayZoomControls(false) // Отключаем сбор метрик webSettings.allowContentAccess = ложь webSettings.allowFileAccess = ложь webSettings.cacheMode = WebSettings.LOAD_NO_CACHE } частное развлечение setWebViewClient() { webView.webViewClient = объект: WebViewClient() { переопределить удовольствие mustOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { // Загрузите URL-адрес в WebView webView.loadUrl(запрос?.url.toString()) вернуть истину } } } частное развлечение setWebChromeClient() { зарегистрироватьForContextMenu (webView) webView.webChromeClient = объект: WebChromeClient() { переопределить удовольствие onShowFileChooser( веб-представление: Веб-представление?, filePathCallback: ValueCallback?, файлЧусерПарамс: ФайлЧусерПарамс? ): Логическое значение { // Обработка загрузки файлов при необходимости вернуть истину } } } переопределить fun onCreateContextMenu(menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo?) { super.onCreateContextMenu(меню, v, менюИнформация) val hitTestResult = (v как WebView).hitTestResult если (hitTestResult.type == WebView.HitTestResult.IMAGE_TYPE || hitTestResult.type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE ) { // Если пользователь долго нажимает на изображение, показывает контекстное меню меню?.add(0, 1, 0, «Сохранить или поделиться уведомлением») } } весело takeScreenshot(view: View): Строка? { // Создаем растровое изображение представления val bitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888) val холст = Холст (растровое изображение) view.draw(холст) // Сохраняем растровое изображение в файл val скриншотФайл = Файл(Environment.getExternalStorageDirectory(), "screenshot.png") пытаться { val fos = FileOutputStream (screenshotFile) bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos) фос.флеш() фос.закрыть() вернуть скриншотFile.absolutePath } поймать (е: исключение) { е.printStackTrace() } вернуть ноль } переопределить удовольствие onContextItemSelected(пункт: MenuItem): Логическое значение { если (item.itemId == 1) { результат val = webView.hitTestResult если (result.type == WebView.HitTestResult.IMAGE_TYPE || result.type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE ) { val imageUrl = result.extra если (!imageUrl.isNullOrEmpty()) { // Показ диалогового окна с опциями: Загрузить или Поделиться внешним showImageOptionsDialog (imageUrl) } еще { Toast.makeText(this, «Не найден действительный URL-адрес изображения», Toast.LENGTH_SHORT).show() } } вернуть истину } вернуть super.onContextItemSelected(элемент) } частное развлечение showImageOptionsDialog (imageUrl: String) { val options = arrayOf("Загрузить", "Поделиться внешним") val builder = AlertDialog.Builder(это) builder.setTitle("Выберите действие") .setItems(options) { диалог, который -> когда (который) { 0 -> downloadImage(imageUrl) 1 → ShareImageExternal (imageUrl) } диалог.отклонить() } val диалог = builder.create() диалог.шоу() } личное развлечение ShareImageExternal(imageUrl: String) { // Скачиваем и сохраняем изображение в файл val imageFilePath = downloadImageLocally (imageUrl) // Проверяем, успешно ли загружен файл if (!imageFilePath.isNullOrBlank()) { // Создаем URI контента из пути к файлу val imageFile = Файл (путь к файлу изображения) val imageUri = FileProvider.getUriForFile( этот, applicationContext.packageName + ".provider", файл изображения ) // Создаем намерение поделиться изображением val ShareIntent = Намерение (Intent.ACTION_SEND) ShareIntent.type = "изображение/*" ShareIntent.putExtra(Intent.EXTRA_STREAM, imageUri) ShareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // Начинаем процесс обмена startActivity(Intent.createChooser(shareIntent, "Поделиться внешним изображением")) } еще { Toast.makeText(this, «Не удалось загрузить и поделиться изображением», Toast.LENGTH_SHORT).show() } } личное развлечение downloadImage(imageUrl: String) { val запрос = DownloadManager.Request(Uri.parse(imageUrl)) .setTitle("Загрузка изображения") .setDescription("Загрузка") .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI или DownloadManager.Request.NETWORK_MOBILE) .setDestinationInExternalPublicDir( Среда.DIRECTORY_DOWNLOADS, "image.${getFileExtension(imageUrl)}" ) val downloadManager = getSystemService(Context.DOWNLOAD_SERVICE) как DownloadManager downloadManager.enqueue (запрос) Toast.makeText(this, «Загрузка уведомления IdentyAlert», Toast.LENGTH_SHORT).show() } личное развлечение downloadImageLocally(imageUrl: String): String? { пытаться { val соединение = URL(imageUrl).openConnection() соединение.connect() val input = Connection.getInputStream() val imageFile = File.createTempFile("shared_image", ".png",cacheDir) вывод val = FileOutputStream(imageFile) буфер значения = ByteArray(1024) var bytesЧтение: Int while (input.read(buffer).also { bytesRead = it } != -1) { вывод.write(буфер, 0, байтыЧтение) } вывод.закрыть() ввод.закрыть() вернуть imageFile.absolutePath } поймать (е: исключение) { е.printStackTrace() вернуть ноль } } личное развлечение getFileExtension(url: String): String { val mimeTypeMap = MimeTypeMap.getSingleton() расширение val = MimeTypeMap.getFileExtensionFromUrl (url) return mimeTypeMap.getMimeTypeFromExtension(расширение)?.split("/")?.get(1) ?: "jpg" }
Это мой файл `provider_paths.xml:
Это мой AndroidManifest.xml:
Когда пользователь нажимает и удерживает изображение, у него есть два варианта:
[*]Загрузить [*]Поделиться внешним
Параметры загрузки работают идеально. Опция «Поделиться» выдает ошибку: «Не удалось загрузить и поделиться изображением»
Я пробовал и другие методы, но безуспешно.
Можете ли вы помочь мне поделиться изображением с другими приложениями?
Я пытаюсь разрешить пользователям обмениваться изображениями из моего приложения с другими приложениями (например, Whatsapp, Telegram, Gmail и т. д.).
Я использую Android Studio, и мое приложение написано на Kotlin.
Вот мой MainActivity.kt:
пакет com.example.example импортировать android.app.AlertDialog импортировать android.app.DownloadManager импортировать android.content.Context импортировать android.content.Intent импортировать android.graphics.Bitmap импортировать android.graphics.Canvas импортировать android.net.Uri импортировать android.os.Build импортировать android.os.Bundle импортировать android.os.Environment импортировать android.view.ContextMenu импортировать android.view.MenuItem импортировать android.view.View импортировать android.webkit.* импортировать android.widget.Toast импортировать androidx.activity.ComponentActivity импортировать androidx.core.content.FileProvider импортировать java.io.File импортировать java.io.FileOutputStream импортировать java.net.URL // Идентификатор OneSignal const val ONESIGNAL_APP_ID = "REAL_KEY_HERE" класс MainActivity : ComponentActivity() { частный lateinit var webView: WebView переопределить fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Инициализация OneSignal // (Здесь ваш существующий код OneSignal) setContentView (R.layout.activity_main) webView = findViewById(R.id.webView) // Настраиваем параметры WebView настроитьWebViewSettings() // Настраиваем WebViewClient setWebViewClient() // Настраиваем WebChromeClient для обработки загрузки файлов setWebChromeClient() // Загружаем исходный URL webView.loadUrl("https://www.example.com/Directory/AppHome.php") } личное развлечение configureWebViewSettings() { val webSettings: WebSettings = webView.settings // Включаем JavaScript в WebView webSettings.javaScriptEnabled = правда // Включаем кэширование webSettings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK // Включаем аппаратное ускорение if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { webView.setLayerType(View.LAYER_TYPE_HARDWARE, ноль) } еще { webView.setLayerType(View.LAYER_TYPE_SOFTWARE, ноль) } // Включаем асинхронную загрузку webSettings.blockNetworkImage = ложь // Отключаем доступ к файлам в WebView webSettings.allowFileAccess = ложь // Отключаем небезопасный контент (HTTP) webSettings.mixedContentMode = WebSettings.MIXED_CONTENT_NEVER_ALLOW // Включаем безопасный просмотр только на устройствах с SDK версии 27 или выше if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { webSettings.safeBrowsingEnabled = true } webSettings.setDisplayZoomControls(false) // Отключаем сбор метрик webSettings.allowContentAccess = ложь webSettings.allowFileAccess = ложь webSettings.cacheMode = WebSettings.LOAD_NO_CACHE } частное развлечение setWebViewClient() { webView.webViewClient = объект: WebViewClient() { переопределить удовольствие mustOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { // Загрузите URL-адрес в WebView webView.loadUrl(запрос?.url.toString()) вернуть истину } } } частное развлечение setWebChromeClient() { зарегистрироватьForContextMenu (webView) webView.webChromeClient = объект: WebChromeClient() { переопределить удовольствие onShowFileChooser( веб-представление: Веб-представление?, filePathCallback: ValueCallback?, файлЧусерПарамс: ФайлЧусерПарамс? ): Логическое значение { // Обработка загрузки файлов при необходимости вернуть истину } } } переопределить fun onCreateContextMenu(menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo?) { super.onCreateContextMenu(меню, v, менюИнформация) val hitTestResult = (v как WebView).hitTestResult если (hitTestResult.type == WebView.HitTestResult.IMAGE_TYPE || hitTestResult.type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE ) { // Если пользователь долго нажимает на изображение, показывает контекстное меню меню?.add(0, 1, 0, «Сохранить или поделиться уведомлением») } } весело takeScreenshot(view: View): Строка? { // Создаем растровое изображение представления val bitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888) val холст = Холст (растровое изображение) view.draw(холст) // Сохраняем растровое изображение в файл val скриншотФайл = Файл(Environment.getExternalStorageDirectory(), "screenshot.png") пытаться { val fos = FileOutputStream (screenshotFile) bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos) фос.флеш() фос.закрыть() вернуть скриншотFile.absolutePath } поймать (е: исключение) { е.printStackTrace() } вернуть ноль } переопределить удовольствие onContextItemSelected(пункт: MenuItem): Логическое значение { если (item.itemId == 1) { результат val = webView.hitTestResult если (result.type == WebView.HitTestResult.IMAGE_TYPE || result.type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE ) { val imageUrl = result.extra если (!imageUrl.isNullOrEmpty()) { // Показ диалогового окна с опциями: Загрузить или Поделиться внешним showImageOptionsDialog (imageUrl) } еще { Toast.makeText(this, «Не найден действительный URL-адрес изображения», Toast.LENGTH_SHORT).show() } } вернуть истину } вернуть super.onContextItemSelected(элемент) } частное развлечение showImageOptionsDialog (imageUrl: String) { val options = arrayOf("Загрузить", "Поделиться внешним") val builder = AlertDialog.Builder(это) builder.setTitle("Выберите действие") .setItems(options) { диалог, который -> когда (который) { 0 -> downloadImage(imageUrl) 1 → ShareImageExternal (imageUrl) } диалог.отклонить() } val диалог = builder.create() диалог.шоу() } личное развлечение ShareImageExternal(imageUrl: String) { // Скачиваем и сохраняем изображение в файл val imageFilePath = downloadImageLocally (imageUrl) // Проверяем, успешно ли загружен файл if (!imageFilePath.isNullOrBlank()) { // Создаем URI контента из пути к файлу val imageFile = Файл (путь к файлу изображения) val imageUri = FileProvider.getUriForFile( этот, applicationContext.packageName + ".provider", файл изображения ) // Создаем намерение поделиться изображением val ShareIntent = Намерение (Intent.ACTION_SEND) ShareIntent.type = "изображение/*" ShareIntent.putExtra(Intent.EXTRA_STREAM, imageUri) ShareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // Начинаем процесс обмена startActivity(Intent.createChooser(shareIntent, "Поделиться внешним изображением")) } еще { Toast.makeText(this, «Не удалось загрузить и поделиться изображением», Toast.LENGTH_SHORT).show() } } личное развлечение downloadImage(imageUrl: String) { val запрос = DownloadManager.Request(Uri.parse(imageUrl)) .setTitle("Загрузка изображения") .setDescription("Загрузка") .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI или DownloadManager.Request.NETWORK_MOBILE) .setDestinationInExternalPublicDir( Среда.DIRECTORY_DOWNLOADS, "image.${getFileExtension(imageUrl)}" ) val downloadManager = getSystemService(Context.DOWNLOAD_SERVICE) как DownloadManager downloadManager.enqueue (запрос) Toast.makeText(this, «Загрузка уведомления IdentyAlert», Toast.LENGTH_SHORT).show() } личное развлечение downloadImageLocally(imageUrl: String): String? { пытаться { val соединение = URL(imageUrl).openConnection() соединение.connect() val input = Connection.getInputStream() val imageFile = File.createTempFile("shared_image", ".png",cacheDir) вывод val = FileOutputStream(imageFile) буфер значения = ByteArray(1024) var bytesЧтение: Int while (input.read(buffer).also { bytesRead = it } != -1) { вывод.write(буфер, 0, байтыЧтение) } вывод.закрыть() ввод.закрыть() вернуть imageFile.absolutePath } поймать (е: исключение) { е.printStackTrace() вернуть ноль } } личное развлечение getFileExtension(url: String): String { val mimeTypeMap = MimeTypeMap.getSingleton() расширение val = MimeTypeMap.getFileExtensionFromUrl (url) return mimeTypeMap.getMimeTypeFromExtension(расширение)?.split("/")?.get(1) ?: "jpg" }
Это мой файл `provider_paths.xml:
Это мой AndroidManifest.xml:
Когда пользователь нажимает и удерживает изображение, у него есть два варианта:
[*]Загрузить [*]Поделиться внешним
Параметры загрузки работают идеально. Опция «Поделиться» выдает ошибку: «Не удалось загрузить и поделиться изображением»
Я пробовал и другие методы, но безуспешно.
Можете ли вы помочь мне поделиться изображением с другими приложениями?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Мое приложение Kotlin не появляется, когда я пытаюсь поделиться изображением из Google
Anonymous » » в форуме JAVA - 0 Ответы
- 20 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Мое приложение Kotlin не появляется, когда я пытаюсь поделиться изображением из Google
Anonymous » » в форуме Android - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-