通过 Android Intent 共享位图

2024-04-11

在我的 Android 应用程序中,我有一个位图(比如 b)和一个按钮。现在,当我单击按钮时,我想共享位图。我正在使用下面的代码onClick()为了达成这个 :-

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/png");
intent.putExtra(Intent.EXTRA_STREAM, b);
startActivity(Intent.createChooser(intent , "Share"));

我期待一个能够处理此意图的所有应用程序的列表,但我什么也没得到。 android studio 中没有应用程序列表,也没有任何错误。我的应用程序只是挂起一段时间然后退出。

我检查了位图,它很好(它不为空)。

我哪里出了问题?


我发现了解决方案的两种变体。两者都涉及将位图保存到存储中,但图像不会出现在图库中。

第一个变体:

保存到外部存储

  • 但到应用程序的私人文件夹。
  • 对于 API

1. 设置权限

添加到AndroidManifest.xml标签之前

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18"/>

2、保存方法:

 /**
 * Saves the image as PNG to the app's private external storage folder.
 * @param image Bitmap to save.
 * @return Uri of the saved file or null
 */
private Uri saveImageExternal(Bitmap image) {
    //TODO - Should be processed in another thread
    Uri uri = null;
    try {
        File file = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "to-share.png");
        FileOutputStream stream = new FileOutputStream(file);
        image.compress(Bitmap.CompressFormat.PNG, 90, stream);
        stream.close();
        uri = Uri.fromFile(file);
    } catch (IOException e) {
        Log.d(TAG, "IOException while trying to write file for sharing: " + e.getMessage());
    }
    return uri;
}

3. 检查存储可访问性

外部存储可能无法访问,因此您应该在尝试保存之前检查它:https://developer.android.com/training/data-storage/files https://developer.android.com/training/data-storage/files

/**
 * Checks if the external storage is writable.
 * @return true if storage is writable, false otherwise
 */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

第二种变体

使用 FileProvider 保存到 cacheDir。它不需要任何权限。

1.在AndroidManifest.xml中设置FileProvider

<manifest>
    ...
    <application>
        ...
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.mydomain.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/file_paths" />
        </provider>
        ...
    </application>
</manifest>

2. 添加路径到res/xml/file_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
         <cache-path name="shared_images" path="images/"/>
    </paths>
</resources>

3、保存方法:

 /**
 * Saves the image as PNG to the app's cache directory.
 * @param image Bitmap to save.
 * @return Uri of the saved file or null
 */
private Uri saveImage(Bitmap image) {
    //TODO - Should be processed in another thread
    File imagesFolder = new File(getCacheDir(), "images");
    Uri uri = null;
    try {
        imagesFolder.mkdirs();
        File file = new File(imagesFolder, "shared_image.png");

        FileOutputStream stream = new FileOutputStream(file);
        image.compress(Bitmap.CompressFormat.PNG, 90, stream);
        stream.flush();
        stream.close();
        uri = FileProvider.getUriForFile(this, "com.mydomain.fileprovider", file);

    } catch (IOException e) {
        Log.d(TAG, "IOException while trying to write file for sharing: " + e.getMessage());
    }
    return uri;
}

有关文件提供程序的更多信息 -https://developer.android.com/reference/android/support/v4/content/FileProvider https://developer.android.com/reference/android/support/v4/content/FileProvider

压缩和保存可能非常耗时,因此应该在不同的线程中完成

实际分享

/**
 * Shares the PNG image from Uri.
 * @param uri Uri of image to share.
 */
private void shareImageUri(Uri uri){
    Intent intent = new Intent(android.content.Intent.ACTION_SEND);
    intent.putExtra(Intent.EXTRA_STREAM, uri);
    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    intent.setType("image/png");
    startActivity(intent);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 Android Intent 共享位图 的相关文章

随机推荐

  • 将库发布到 Maven 存储库

    我有一个稳定的开源库 http github com fernandezpablo85 scribe并想知道如何 以及是否 我可以将我的库发布到 Maven 官方存储库 以便人们可以将其包含在他们的pom xml文件并自动下载依赖项 将您的
  • sql server 查询中的明智移位日期时间检查

    我的一个项目中的 sql 查询有一个问题 实际上 我必须检查某个具有三个班次的表中的一个 DateTime 列 即 我必须根据相应班次中的 RegisteredDateTime 列获取记录 我们的轮班时间如下 轮班时间为 24 小时制 Sh
  • Python-PostgreSQL psycopg2 接口 -->executemany

    我目前正在分析维基百科转储文件 我使用 python 从中提取大量数据并将其保存到 PostgreSQL 数据库中 我总是试图让事情进展得更快 因为这个文件很大 18GB 为了与 PostgreSQL 交互 我使用 psycopg2 但该模
  • 自动扩展 Axon 的跟踪事件处理器

    我使用 Axon 框架 4 0 3 和 Spring Boot 来进行事件溯源 并有一个跟踪处理器 该处理器配置为具有多个段 线程来同时处理事件 axon eventhandling processors my processor init
  • 设计confirmation_token无效

    我的用户 rb class User lt ActiveRecord Base devise database authenticatable registerable confirmable token authenticatable r
  • 如何使用 python 避免机器人检测并抓取网站?

    我的问题 我想抓取以下网站 https www coches net segunda mano https www coches net segunda mano 但每次我用 python selenium 打开它时 我都会收到消息 他们将
  • Spring框架有自己的bean吗?

    这段文字来自 Core Java Server Faces 一书 有两个独立的机制是历史的偶然 CDI bean 和 JSF 托管 bean 适用于可在 JSF 中使用的 bean 页 我们建议您使用 CDI bean 除非您的应用程序必须
  • Python - 如何在 Visual Studio Code 本身中显示图形?

    当我尝试运行这个示例时 import matplotlib pyplot as plt import matplotlib as mpl import numpy as np x np linspace 0 20 100 plt plot
  • GDI+闪烁

    所以我正在尝试制作一个廉价的 Gyazo 屏幕截图工具 副本 问题是光标坐标闪烁 我该如何防止呢 我已经尝试过了WM ERASEBKGND但这没有任何帮助 另外我的代码还有什么问题吗 有什么不好的做法 技术吗 include
  • 如何继承替换switch case?

    我正在使用 C Switch case 如何使用继承来替换 情况就像 1 2 3 4 所以 我怎样才能实现它 for eg public Blocks int code bool shp1 switch code case 1 this W
  • 玩具外壳管道不正确

    我不会撒谎 这是一个家庭作业问题 然而 就我而言 积分已经消失了 现在 我只是在寻找答案 因为我想我可能疯了 该程序的目标是执行命令ps A grep inputstring wc l其方式与 shell 的操作方式类似 因此 我生成进程
  • 如何使用 UserManager 在 IdentityUser 上加载导航属性

    我已经延长了IdentityUser包含用户地址的导航属性 但是当让用户使用UserManager FindByEmailAsync 导航属性未填充 ASP NET Identity Core 是否有某种方法来填充导航属性 例如实体框架的导
  • Java - 二维数组检查对角线数字板

    目前我正在开发一个在 8x8 2D 阵列板中生成随机 0 和 1 的程序 我要做的是检查对角线上的所有数字是否相同 从角开始 而不仅仅是任何对角线 example int array 0 0 0 0 0 0 0 1 0 0 1 0 1 0
  • VS Code 无法正确设置断点

    我正在尝试调试一个小项目 但无法让 Chrome 扩展调试器完全工作 当我放置断点时 它会移到我想要调试的函数之外 我正在使用 webpack babel 我的项目托管在 Net 平台 特别是 DNN 上 包 json name disab
  • InputDispatcher:由于输入调度被禁用而丢弃事件

    我正在为 Android 开发 ui 自动化平台 由于某种原因 有时 非常罕见 点击事件可能会被删除 当它发生时我在日志中看到 I InputDispatcher 2707 Dropped event because input dispa
  • VS2010,F5 - 构建但不运行(WPF)

    我们刚刚将 WPF 应用程序转换为 VS2010 当我按 F5 时 解决方案会构建 但随后不会运行 如果我执行 CNTL F5 无需调试即可启动 应用程序运行得很好 有任何想法吗 谢谢 杰夫 不知道那是什么 删除 suo文件 关闭VS201
  • 根据显示器分辨率缩放网站?

    我正在寻找一个 JavaScript 来根据浏览者的屏幕分辨率更改网站的缩放 我在桌面上制作了 1920x1080p 的网站 html moz transform scale 0 75 0 75 zoom 0 75 zoom 75 我在我的
  • 无法通过 JNDI 查找 OSGI 服务

    我正在使用 JBossAS7 我的应用程序有一些 OSGI 模块和大型非 OSGI 部分 我尝试通过 JNDI 在非 osgi 子系统中查找 osgi 服务 但它们不存在于 JNDI 上下文中 我发现类似的问题JBOSS 7 JNDI 树中
  • 在程序集中搜索所有子类型?

    我想找到从基 接口继承的所有类型 有人有一个好的方法来做到这一点吗 有想法吗 我知道这是一个奇怪的请求 但我仍然在玩它 使用 Assembly GetTypes 获取所有类型 并使用 Type IsAssignableFrom 检查继承 如
  • 通过 Android Intent 共享位图

    在我的 Android 应用程序中 我有一个位图 比如 b 和一个按钮 现在 当我单击按钮时 我想共享位图 我正在使用下面的代码onClick 为了达成这个 Intent intent new Intent Intent ACTION SE