如何在Android上使用Google Cloud Print API?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (34)

我正在研究需要打印到打印机的Android应用程序。我做的过程如下:

  1. 用户选择我在某些信息旁边显示的打印按钮。
  2. 显示对话框,其中预览了要打印的内容。在ActionBar中有一个按钮,显示“打印”。这开始了这个过程。
  3. 显示一个新的活动,显示连接到该用户Google帐户的打印机列表。用户必须选择一个。
  4. 显示新页面,给出打印作业的描述。
  5. 用户必须选择右上角的“打印”。
  6. 打印作业开始并且打印机打印出图片。

然后我以这种方式提交输出结果。我做了以下几点:

  1. 使用Google Play服务为用户Gmail帐户检索OAuth令牌。
  2. 使用/ search API调用获取打印机列表。
  3. 使用/提交API调用提交打印作业。

关于我如何发送请求的一些代码:

ContentResolver contentResolver = context.getContentResolver();
try {
    InputStream is = contentResolver.openInputStream(uri);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    byte[] buffer = new byte[4096];
    int n = is.read(buffer);
    while (n >= 0) {
            baos.write(buffer, 0, n);
            n = is.read(buffer);
    }
    is.close();
    baos.flush();

    content = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);
} catch (FileNotFoundException e) {
    Log.d(TAG, "File not found: " + uri.toString(), e);
} catch (IOException e) {
    e.printStackTrace();
}

我还使用了下面的powerje,但还是设法解决这个问题:

public void submitPrintJobWithFile(String printerId, String title, String token, String filePath, String contentType){
    File file = new File(filePath);
    // Method that gets the correct headers
    List<Header> headers = getHeaders(contentType, token);
    // Method that gets the correct post parameters
    String url = CLOUDPRINT_URL + PATH_SUBMIT;
    List<NameValuePair> postParams = getParams(title, contentType);
    String params = "access_token=" + token + "&cookies=false" + "&printerid=" + printerId;
    url += params;
    response = sendMultipartData(url, file, postParams, headers);
}

private String sendMultipartData(String url, File file, List<NameValuePair> fields, List<Header> headers){
    HttpPost post = new HttpPost(url);
    MultipartEntity entity = new MultipartEntity();
    for(NameValuePair pair : fields){
        String name = pair.getName();
        String value = pair.getValue();
        try{
            entity.addPart(name, new StringBody(value));
        }catch (UnsupportedEncodingException e){
            Log.d(TAG, "Error turning pair (name=" + name + ", value=" + value + ") into StringBody.");
    }
    entity.addPart("content", new FileBody(file));
    post.setEntity(entity);
    // Finish HttpClient request here...
}
提问于
用户回答回答于

看起来你需要使用多部分编码,例如:

http://blog.tacticalnuclearstrike.com/2010/01/using-multipartentity-in-android-applications/

你可以使用这样的代码:

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.tumblr.com/api/write");

try {
    MultipartEntity entity = new MultipartEntity();

    entity.addPart("type", new StringBody("photo"));
    entity.addPart("data", new FileBody(image));
    httppost.setEntity(entity);
    HttpResponse response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
} catch (IOException e) {
} 

 
用户回答回答于

看看Python示例代码中的 SubmitJob方法,似乎只有PDF类型需要在Base64中编码。

扫码关注云+社区