Hello Dear Friends,
My this post is based on "How to Integrate printer in android app". the best way of doing that Google cloud printing. Google provide us Print Dialog code, we can use it in our application. Important steps are given below-
1)Login with your gmail-id in chrome on your desktop and add your printers in your browser.
2)Create a demo app and put below code.
3)Add Internet permissions and read storage.
2)PrintDialogActivity.java
My this post is based on "How to Integrate printer in android app". the best way of doing that Google cloud printing. Google provide us Print Dialog code, we can use it in our application. Important steps are given below-
1)Login with your gmail-id in chrome on your desktop and add your printers in your browser.
2)Create a demo app and put below code.
3)Add Internet permissions and read storage.
<uses-permission android:name="android.permission.INTERNET"
/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
/>
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE"
/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"
/>
1)MainActivity.java
package
com.manish.googleprintdemo;
import java.io.File;
import
android.app.Activity;
import
android.content.Context;
import
android.content.Intent;
import
android.net.ConnectivityManager;
import
android.net.NetworkInfo;
import android.net.Uri;
import android.os.Bundle;
import
android.os.Environment;
import android.util.Log;
import android.view.View;
import
android.view.View.OnClickListener;
import
android.widget.Button;
import
android.widget.Toast;
/**
*
* @author manish
*
*/
public class MainActivity extends Activity {
Button
btnPrint;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnPrint=(Button)findViewById(R.id.button1);
btnPrint.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated
method stub
if (isNetworkAvailable() == false) {
Toast.makeText(MainActivity.this,
"Network
connection not available, Please try later",
Toast.LENGTH_SHORT).show();
}
else {
File
file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/personal/xyz.pdf");
Intent
printIntent = new Intent(MainActivity.this, PrintDialogActivity.class);
printIntent.setDataAndType(Uri.fromFile(file),
"application/pdf");
printIntent.putExtra("title", "Android print
demo");
startActivity(printIntent);
}
}
});
}
public boolean isNetworkAvailable()
{
ConnectivityManager
cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo
networkInfo = cm.getActiveNetworkInfo();
// if no network is
available networkInfo will be null
// otherwise check
if we are connected
if (networkInfo != null &&
networkInfo.isConnected()) {
Log.e("Network
Testing", "***Available***");
return true;
}
Log.e("Network
Testing", "***Not Available***");
return false;
}
}
package
com.manish.googleprintdemo;
import
android.annotation.SuppressLint;
import
android.app.Activity;
import
android.content.ActivityNotFoundException;
import
android.content.ContentResolver;
import
android.content.Intent;
import android.os.Bundle;
import android.util.Base64;
import
android.webkit.WebSettings;
import
android.webkit.WebView;
import
android.webkit.WebViewClient;
import
java.io.ByteArrayOutputStream;
import
java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class PrintDialogActivity extends Activity {
private static final String PRINT_DIALOG_URL = "https://www.google.com/cloudprint/dialog.html";
private static final String JS_INTERFACE = "AndroidPrintDialog";
private static final String CONTENT_TRANSFER_ENCODING = "base64";
private static final String ZXING_URL = "http://zxing.appspot.com";
private static final int ZXING_SCAN_REQUEST = 65743;
/**
* Post message that is sent by Print Dialog web page when the printing
dialog
* needs to be closed.
*/
private static final String CLOSE_POST_MESSAGE_NAME = "cp-dialog-on-close";
/**
* Web view element to show the printing dialog in.
*/
private WebView dialogWebView;
/**
* Intent that started the action.
*/
Intent cloudPrintIntent;
@SuppressLint("JavascriptInterface") @Override
public void onCreate(Bundle
icicle) {
super.onCreate(icicle);
setContentView(R.layout.print_dialog);
dialogWebView = (WebView)
findViewById(R.id.webview);
cloudPrintIntent = this.getIntent();
WebSettings settings = dialogWebView.getSettings();
settings.setJavaScriptEnabled(true);
dialogWebView.setWebViewClient(new
PrintDialogWebClient());
dialogWebView.addJavascriptInterface(
new PrintDialogJavaScriptInterface(),
JS_INTERFACE);
dialogWebView.loadUrl(PRINT_DIALOG_URL);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent
intent) {
if (requestCode == ZXING_SCAN_REQUEST &&
resultCode == RESULT_OK) {
dialogWebView.loadUrl(intent.getStringExtra("SCAN_RESULT"));
}
}
final class
PrintDialogJavaScriptInterface {
public String getType() {
return cloudPrintIntent.getType();
}
public String getTitle() {
return cloudPrintIntent.getExtras().getString("title");
}
public String getContent()
{
try {
ContentResolver contentResolver = getContentResolver();
InputStream is = contentResolver.openInputStream(cloudPrintIntent.getData());
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();
return Base64.encodeToString(baos.toByteArray(),
Base64.DEFAULT);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
public String getEncoding()
{
return CONTENT_TRANSFER_ENCODING;
}
public void onPostMessage(String
message) {
if (message.startsWith(CLOSE_POST_MESSAGE_NAME)) {
finish();
}
}
}
private final class PrintDialogWebClient
extends WebViewClient {
@Override
public boolean
shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith(ZXING_URL)) {
Intent intentScan = new Intent("com.google.zxing.client.android.SCAN");
intentScan.putExtra("SCAN_MODE", "QR_CODE_MODE");
try {
startActivityForResult(intentScan, ZXING_SCAN_REQUEST);
} catch (ActivityNotFoundException error) {
view.loadUrl(url);
}
} else {
view.loadUrl(url);
}
return false;
}
@Override
public void
onPageFinished(WebView view, String url) {
if (PRINT_DIALOG_URL.equals(url)) {
//
Submit print document.
view.loadUrl("javascript:printDialog.setPrintDocument(printDialog.createPrintDocument("
+ "window." + JS_INTERFACE + ".getType(),window." + JS_INTERFACE + ".getTitle(),"
+ "window." + JS_INTERFACE + ".getContent(),window." + JS_INTERFACE + ".getEncoding()))");
//
Add post messages listener.
view.loadUrl("javascript:window.addEventListener('message',"
+ "function(evt){window." + JS_INTERFACE + ".onPostMessage(evt.data)},
false)");
}
}
}
}
3)activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="Print" />
</RelativeLayout>
4)print_dialog.xml
<?xml version="1.0"
encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
5)AndroidManifest.xml
<?xml version="1.0"
encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.manish.googleprintdemo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" />
<uses-permission android:name="android.permission.INTERNET"
/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
/>
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE"
/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"
/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.manish.googleprintdemo.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN"
/>
<category android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
<activity android:name=".PrintDialogActivity"
/>
</application>
</manifest>
Thanks!