2013-01-22 13 views
18

मैं एक Android आवेदन एक प्रिंटर से प्रिंट करने की आवश्यकता है पर काम कर रहा हूँ से Google क्लाउड प्रिंट एपीआई का उपयोग करना। मैंने Google क्लाउड प्रिंट का उपयोग करने का निर्णय लिया, क्योंकि इसे स्थापित करना आसान लग रहा था। प्रारंभ में, मैंने एंड्रॉइड में एकीकृत करने के लिए here पाया चरणों का पालन किया। यह काम करता है, जैसा कि इसमें मेरे वांछित प्रिंटर को प्रिंट किया जाएगा। हालांकि, यह प्रक्रिया उपयोगकर्ता के लिए थोड़ा सा शामिल है। मेरे मामले में, प्रक्रिया इस प्रकार है:एंड्रॉयड

  1. उपयोगकर्ता प्रिंट बटन है कि मैं कुछ जानकारी के बगल में है का चयन करता है।
  2. एक संवाद क्या प्रिंट किया जाएगा के पूर्वावलोकन के साथ दिखाया गया है। एक्शनबार में एक बटन है जो "प्रिंट" कहता है। यह प्रक्रिया शुरू होता है।
  3. एक नई गतिविधि प्रिंटर है कि उपयोगकर्ताओं को Google खाते से कनेक्ट कर रहे हैं की एक सूची दिखा प्रदर्शित होता है। उपयोगकर्ता को एक का चयन करना होगा।
  4. प्रिंट पेज का विवरण देने वाला एक नया पृष्ठ दिखाया गया है।
  5. उपयोगकर्ता "प्रिंट" ऊपरी दाहिने हाथ कोने में चयन करने के लिए है।
  6. प्रिंट जॉब शुरू हो गया है और प्रिंटर तस्वीर प्रिंट करता है।

दुर्भाग्य से, मेरे मुवक्किल इस प्रक्रिया को नहीं चाहता है। वे चाहते हैं कि उपयोगकर्ता चरण दो में "प्रिंट" पर क्लिक करें, और फिर चित्र मुद्रित करें (चरण 1, 2 और 6)। इस प्रकार, मैं Google द्वारा प्रदान किए गए इरादे का उपयोग नहीं कर सकता, मुझे वास्तविक API का उपयोग करना होगा। इसके लिए मुझे Google ऑथ टोकन प्राप्त करने, वांछित प्रिंटर प्राप्त करने और उस तरह से प्रिंट नौकरी सबमिट करने की आवश्यकता है। मैं निम्नलिखित करता हूं:

  1. उपयोगकर्ता जीमेल खाते के लिए ओएथ टोकन पुनर्प्राप्त करने के लिए Google Play सेवाओं का उपयोग करें।
  2. /खोज एपीआई कॉल का उपयोग कर प्रिंटर की एक सूची प्राप्त करें।
  3. एपीआई कॉल जमा/सबमिट करके प्रिंट प्रिंट सबमिट करें।

मैं पहले दो समाप्त हो गया है। मुझे तस्वीर की वास्तविक प्रिंटिंग में परेशानी हो रही है। तस्वीर को मुद्रित करने के बजाय, तस्वीर के बाइट डेटा को मुद्रित किया जा रहा है (बेस 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 क्लाउड प्रिंट पेज (ऊपर से लिंक) पर प्रदान की जाती है। निम्नलिखित मैं कैसे भेज है कि अप:

जहां तक ​​मेरा बता सकते हैं, यह कैसे यह माना जाता है है। प्रिंटिंग करते समय मुझे {"सफलता": सत्य} की प्रतिक्रिया मिल रही है। लेकिन, जैसा कि मैंने उपरोक्त कहा है, यह वास्तविक बेस 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... 
} 
+0

क्या आप पहले दो चरणों को संभालने पर अपने काम के कुछ नमूने प्रदान कर सकते हैं? – Skiba

+0

मैं वही करना चाहता हूं लेकिन बिना चरणमैं उसी स्थानीय नेटवर्क से जुड़े प्रिंटर को प्रदर्शित करना चाहता हूं और प्रिंटर के लिए अपने आईपी पते –

+0

के साथ सर्च के लिए समर्थन का समर्थन करना चाहता हूं नमस्ते @ एरेट्स यू यू 1 और 2 – SaravanaRaja

उत्तर

2

ऐसा लगता है कि आप बहुखण्डीय एन्कोडिंग, उदाहरण के यहाँ उपयोग करने की आवश्यकता:

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

एफटीए:

फ़ाइलों की जरूरत apache-mime4j, httpclient, httpcore and httpmime हैं। सभी Apache नींव द्वारा निर्मित ओपनसोर्स परियोजनाएं हैं।

4 फाइलें डाउनलोड करें और उन्हें अपनी प्रोजेक्ट में जोड़ें, तो आपको स्ट्रिंग्स और फ़ाइलों को पृष्ठों पर पोस्ट करने के लिए निम्न कोड का उपयोग करने में सक्षम होना चाहिए।

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) { 
} 

इस मामले में छवि चर एक फ़ाइल है कि एक छवि फ़ोन के कैमरे द्वारा कब्जा कर लिया होता है।

+1

यह वास्तव में काम किया था। धन्यवाद। – ariets

1

Python Sample Code SubmitJob विधि को देखते हुए ऐसा लगता है कि केवल पीडीएफ typs Base64 में एनकोड करने की आवश्यकता: बल्कि उपरोक्त कोड का उपयोग करने से, मैं निम्नलिखित का इस्तेमाल किया।

+0

को पूरा करने के लिए आपके द्वारा अनुसरण किए गए चरण को साझा कर सकता है आह, तुम सही हो। यकीन नहीं है कि मैं इसे कैसे चूक गया। मैं इसे एक शॉट दूंगा। – ariets

+0

बस ध्यान दें, यह मेरे लिए काम नहीं करता है। – ariets

0

कुछ अद्यतन के साथ प्रश्न का उत्तर दें। अक्टूबर 2013 तक, 4.4 और समर्थन पुस्तकालय में, प्रिंटिंग को संभालने के तरीकों में बनाया गया है। - मुद्रण बिटमैप के साथ मदद करने के लिए समर्थन पुस्तकालय वर्ग

  • PrintHelper: कैसे ठीक ऐसा करने के लिए निम्नलिखित दस्तावेज़ देखें।
  • DevBytes: Android 4.4 Printing API - एक Android डेवलपर वीडियो एपीआई
  • Printing Content का ब्यौरा - कैसे इन API का उपयोग करने पर एक Android प्रशिक्षण गाइड।