Android系统下通过Web方式访问受保护的图片



假设我在某个URL (http://www.example.com/specialimages/cutepuppy.png)上有一个图像。这个图像是付费应用的一部分我不希望人们到这个URL右键保存。我添加了htaccess密码保护。完美!它的工作原理……URL是受保护的,只有我可以使用有效的凭据访问它。(真的,任何有用户名和密码的人都可以。)

接下来,在Android中,我使用Universal-Image-Loader库将图像加载到我的应用程序中。加载器代码如下所示:

ImageLoader imageLoader = ImageLoader.getInstance(); 
imageLoader.displayImage(
    "http://Validuser:Validuserpassword@www.example.com/specialimages/cutepuppy.png",
    gridViewImageHolder.imageView,
    ImageLoaderUtil.options);

Validuser:Validuserpassword是这个小技巧访问URL的htaccess保护。一切似乎都合乎逻辑,除了图像加载器抛出FileNoteFoundException,因为URL无效:

09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader: http://Validuser:Validuserpassword@www.example.com/specialimages/cutepuppy.png.jpg
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader: java.io.FileNotFoundException: http://Validuser:Validuserpassword@www.example.com/specialimages/cutepuppy.png.jpg
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:238)
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStreamFromNetwork(BaseImageDownloader.java:124)
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStream(BaseImageDownloader.java:88)
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.downloadImage(LoadAndDisplayImageTask.java:291)
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryCacheImageOnDisk(LoadAndDisplayImageTask.java:274)
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:230)
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:136)
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at java.lang.Thread.run(Thread.java:818)

所以…我的问题是什么?我想知道的是,如果有另一种方法来做这样的事情:通过浏览器保护web目录,但以某种方式在Android代码(Java)中传递有效的凭据,以便应用程序,只有应用程序,可以去抓取图像。

编辑

如果我访问我的URL(当然不是这个)与Validuser:Validuserpassword之前在我的笔记本电脑或手机上的浏览器,图像加载良好…我的服务器配置正确,可以处理htaccess

据我所知,当你加载这样一个URL:

http://Validuser:Validuserpassword@www.example.com/specialimages/cutepuppy.png.jpg

在您的web浏览器中,浏览器透明地将用户/密码组件转换为HTTP Authorization请求头。

因此,看起来OkHttp并没有像你的浏览器那样做。

Universal-Image-Loader是否允许您操作请求头,以便您可以自己提供此头?

如果您可以这样做,那么您需要相应地生成它。请看这里的格式:

https://en.wikipedia.org/wiki/Basic_access_authentication Client_side

看起来像这个其他StackOverflow问题有一个工作实现:

在通用图像加载器中访问受保护的图像

最新更新