मैं एक Android आवेदन एक प्रिंटर से प्रिंट करने की आवश्यकता है पर काम कर रहा हूँ से Google क्लाउड प्रिंट एपीआई का उपयोग करना। मैंने Google क्लाउड प्रिंट का उपयोग करने का निर्णय लिया, क्योंकि इसे स्थापित करना आसान लग रहा था। प्रारंभ में, मैंने एंड्रॉइड में एकीकृत करने के लिए here पाया चरणों का पालन किया। यह काम करता है, जैसा कि इसमें मेरे वांछित प्रिंटर को प्रिंट किया जाएगा। हालांकि, यह प्रक्रिया उपयोगकर्ता के लिए थोड़ा सा शामिल है। मेरे मामले में, प्रक्रिया इस प्रकार है:एंड्रॉयड
- उपयोगकर्ता प्रिंट बटन है कि मैं कुछ जानकारी के बगल में है का चयन करता है।
- एक संवाद क्या प्रिंट किया जाएगा के पूर्वावलोकन के साथ दिखाया गया है। एक्शनबार में एक बटन है जो "प्रिंट" कहता है। यह प्रक्रिया शुरू होता है।
- एक नई गतिविधि प्रिंटर है कि उपयोगकर्ताओं को Google खाते से कनेक्ट कर रहे हैं की एक सूची दिखा प्रदर्शित होता है। उपयोगकर्ता को एक का चयन करना होगा।
- प्रिंट पेज का विवरण देने वाला एक नया पृष्ठ दिखाया गया है।
- उपयोगकर्ता "प्रिंट" ऊपरी दाहिने हाथ कोने में चयन करने के लिए है।
- प्रिंट जॉब शुरू हो गया है और प्रिंटर तस्वीर प्रिंट करता है।
दुर्भाग्य से, मेरे मुवक्किल इस प्रक्रिया को नहीं चाहता है। वे चाहते हैं कि उपयोगकर्ता चरण दो में "प्रिंट" पर क्लिक करें, और फिर चित्र मुद्रित करें (चरण 1, 2 और 6)। इस प्रकार, मैं Google द्वारा प्रदान किए गए इरादे का उपयोग नहीं कर सकता, मुझे वास्तविक API का उपयोग करना होगा। इसके लिए मुझे Google ऑथ टोकन प्राप्त करने, वांछित प्रिंटर प्राप्त करने और उस तरह से प्रिंट नौकरी सबमिट करने की आवश्यकता है। मैं निम्नलिखित करता हूं:
- उपयोगकर्ता जीमेल खाते के लिए ओएथ टोकन पुनर्प्राप्त करने के लिए Google Play सेवाओं का उपयोग करें।
- /खोज एपीआई कॉल का उपयोग कर प्रिंटर की एक सूची प्राप्त करें।
- एपीआई कॉल जमा/सबमिट करके प्रिंट प्रिंट सबमिट करें।
मैं पहले दो समाप्त हो गया है। मुझे तस्वीर की वास्तविक प्रिंटिंग में परेशानी हो रही है। तस्वीर को मुद्रित करने के बजाय, तस्वीर के बाइट डेटा को मुद्रित किया जा रहा है (बेस 64 एन्कोडेड)। यहाँ कैसे मैं अनुरोध भेज रहा हूँ करने के लिए के रूप में कुछ कोड है:
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();
}
इस कोड को चित्र (चर "uri" उस फ़ाइल का यूआरआई है) प्राप्त करता है, और यह एक Base64 इनकोडिंग स्ट्रिंग में बदल जाता है। यह PrintDialogActivity में उपयोग की जाने वाली वही विधि है जो Google क्लाउड प्रिंट पेज (ऊपर से लिंक) पर प्रदान की जाती है। निम्नलिखित मैं कैसे भेज है कि अप:
- यूआरएल: http://www.google.com/cloudprint/submit?access_token=[AUTH_TOKEN_GOES_HERE]&cookies=false&printerid=[PRINTER_ID_HERE]
- HTTP विधि: पोस्ट
- पोस्ट पैरामीटर: [printerId = PRINTER_ID_HERE, title = TestPrint, contentType = image/jpeg, क्षमताओं = { " क्षमताओं ": [{}]}, सामग्री = [Base64 एनकोड किया गया डेटा स्ट्रिंग यहाँ रखा गया है]]
जहां तक मेरा बता सकते हैं, यह कैसे यह माना जाता है है। प्रिंटिंग करते समय मुझे {"सफलता": सत्य} की प्रतिक्रिया मिल रही है। लेकिन, जैसा कि मैंने उपरोक्त कहा है, यह वास्तविक बेस 64 डेटा स्ट्रिंग को प्रिंट करता है। किसी भी सहायता की सराहना की जाएगी।
संपादित करें: नीचे दिए गए पावरजे का उपयोग करके, मैंने इसे ठीक करने में कामयाब रहे।
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...
}
क्या आप पहले दो चरणों को संभालने पर अपने काम के कुछ नमूने प्रदान कर सकते हैं? – Skiba
मैं वही करना चाहता हूं लेकिन बिना चरणमैं उसी स्थानीय नेटवर्क से जुड़े प्रिंटर को प्रदर्शित करना चाहता हूं और प्रिंटर के लिए अपने आईपी पते –
के साथ सर्च के लिए समर्थन का समर्थन करना चाहता हूं नमस्ते @ एरेट्स यू यू 1 और 2 – SaravanaRaja