jjzjj

Android:通过 content:// URI 从第三方应用程序(例如 WhatsApp)获取图像位图

codeneng 2023-03-28 原文

Android: Getting image bitmap from third party app (e.g. WhatsApp) via content:// URI

我正在尝试从第三方应用程序(例如 WhatsApp)获取图像到我的应用程序(在 Marshmallow 上进行测试)。当我从 WhatsApp 执行"共享图像"并与我的应用程序共享时,我得到的 URI 是这样的:

1
content://com.whatsapp.provider.media/item/61025

但在我的应用程序中,当我使用上述 URI 调用 getContentResolver().openInputStream(uri)getContentResolver().openFileDescriptor(uri,"r") 时,它会崩溃并出现异常:

java.lang.SecurityException: Permission Denial: opening provider
com.whatsapp.MediaProvider from ProcessRecord{a4b804a
30321:com.myapp/u0a145} (pid=30321, uid=10145) that is not exported
from uid 10083

到目前为止我尝试了什么

我在 SO 上查找了此异常,发现提出了类似的问题,但要从 Google Photos 导入图像并需要添加以下权限:

<uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/>

但对此不以为然,因为可能有很多应用程序,需要为每个应用程序添加权限或什么。

在其他一些答案中,建议立即从内容提供者读取/复制数据。但不确定如何。因为我在 openInputStream 本身中遇到异常。

我还必须提到,WhatsApp 图像可以成功地与其他应用程序(例如 Google Drive)共享,所以必须有一些方法可以做到这一点。

请有人对此提供分享提示或可行的解决方案吗?

  • 您是否有权从外部存储读取并在运行时检查它?
  • 该提供程序未导出,只有一些有限的包子集可以访问它(如谷歌驱动器),但您的应用程序不允许这样做
  • @Nabin 是的,我有权限
  • @pskink如果是这种情况,那么标准是什么。因为我尝试使用其他一些非 Google 应用程序(例如图像编辑器应用程序 InShot、文件传输 Xender)并且它可以与它们一起使用。无论如何是记录在任何地方请分享链接。谢谢。
  • 发布您尝试过的代码,包括清单。仅从 WhatsApp 或从其他应用程序共享时是否会出现此问题?从画廊呢?
  • @Nabin我观察到的是,当我的应用程序通过内容uri(content:)而不是当它获取文件uri(file:)时,会发生这种情况。由于画廊和其他应用程序我尝试使用文件 uri 共享他们的图像,所以我没有得到异常。但是 WhatsApp 给了我它图片的内容 uri。
  • @Nabin:应用程序代码太大,无法共享。但是只要涉及到这次崩溃,就没有什么了。我只是将输入 URI 传递给 getContentResolver().openInputStream(uri) 并且它在那里崩溃,尤其是当 uri 是来自 WhatsApp 的内容 uri 时。


好的。我发现问题出在哪里。在我的应用程序的初始活动中,我将内容 URI(我从 WhatsApp 或 Chrome 等第三方应用程序获得,例如 content://com.whatsapp.provider.media/item/61025)存储在一个数组中,并从其他活动。

那是不正确的。我从这个答案中得到了提示,我在获得共享内容后立即从应用程序的启动器活动中调用了 getContentResolver().openInputStream(uri) 。它有效,没有抛出任何异常。

  • 您能否提供示例代码以从内容获取路径://com.whatsapp.provider.media/item/45856
  • 不要尝试从 URI 获取路径 它不是处理 URI 的正确方法。而是使用 getContentResolver().openInputStream(uri)
  • getContentResolver().openInputStream(uri) 它返回什么??我完全糊涂了
  • getContentResolver().openInputStream 返回 InputStream 您需要读取共享数据。例如,如果是图像数据,您可以调用 BitmapFactory.decodeStream。请谷歌如何从 InputStream 读取数据。
  • 感谢您的解释,我解决了。它从 BitmapFactory.decodeStream 返回位图,从那里我得到了路径。花了 2 天哇! 1 为您提供帮助。

有关Android:通过 content:// URI 从第三方应用程序(例如 WhatsApp)获取图像位图的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  3. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  4. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  5. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  6. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  7. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  8. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  9. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  10. ruby-on-rails - Enumerator.new 如何处理已通过的 block ? - 2

    我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m

随机推荐