Android | Fresco / FrescoLib + Azure

Android | Fresco / FrescoLib + Azure

我在 Azure 中托管我的应用程序(Web 服务 + 文件存储服务)。

我希望在我的应用程序中使用 Fresco (SimpleDraweeView),问题是我无法直接 url 给用户,因为 azure 中的存储是私有的。

我唯一能做的就是将图像作为字节数组获取(使用我的 Web 服务)并将该字节数组转发回 android 客户端。

如何将 simpledraweeview 与字节数组而不是直接 link 一起使用?

我试图在我的网络服务中设置一个端点,用户在其中给我图像 ID 和端点 returns 返回字节数组,我试图将此端点用作 url 对于 simpledraweeview.setImageUrl 方法,但没有运气。

根据你的描述,根据我的经验,听起来你需要创建一个 Web 应用程序作为代理服务来访问托管在 Azure File Storgae 上的图像并将其响应回 andoird。

假设您是 Java Web 开发人员,我认为简单的方法是您可以 create a Java web app in Azure App Service, then create a Java servlet for the Java web app and refer to the article How to use File Storage from Java 下载图像以通过管道将流传输到 http servlet 响应,请参阅示例代码下面。

private static final String storageConnectionString =
            "DefaultEndpointsProtocol=http;" +
                    "AccountName=your_storage_account_name;" +
                    "AccountKey=your_storage_account_key";
private CloudFileClient fileClient;

/**
 * @see HttpServlet#HttpServlet()
 */
public PipeStream4FileStorage() {
    super();
    try {
        CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);
        fileClient = storageAccount.createCloudFileClient();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String dirName = request.getParameter("dir");
    String fileName = request.getParameter("file");
    OutputStream outStream = response.getOutputStream();
    try {
        // Get a reference to the file share
        CloudFileShare share = fileClient.getShareReference("sampleshare");
        //Get a reference to the root directory for the share.
        CloudFileDirectory rootDir = share.getRootDirectoryReference();
        //Get a reference to the directory that contains the file
        CloudFileDirectory sampleDir = rootDir.getDirectoryReference(dirName);
        //Get a reference to the file you want to download
        CloudFile file = sampleDir.getFileReference(fileName);
        //Write the stream of the file to the httpServletResponse.
        file.download(outStream);
    } catch (URISyntaxException e) {
        e.printStackTrace();
    } catch (StorageException e) {
        e.printStackTrace();
    }
}

注意,请查看关键函数的 javadoc download(OutputStream outStream)

然后,您只需要为 SimpleDraweeView 设置图像 url,如下所示。

Uri uri = Uri.parse("https://<your-webapp-name>.azurewebsites.net/<servlet-url-mapping-name>?dir=<dir-name>&file=<file-name>");
SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);
draweeView.setImageURI(uri);