ashishthehunk

Lurker
Aug 21, 2012
7
0
5
Well, basically my teacher has told me to make an andorid app which can connect to a desktop or a laptop wirelessly like via bluetooth and can send a pdf file from android phone to the desktop and then we could be able to print that file through our phone only. We have to somehow create an app which will not only send the file to the computer, but also print that file through the printer which is connected to the computer. All this we have to do remotely through our android phone without even touching the computer. I havent made any adroid app previously :thinking: I dont have any idea what to do next... please help me out guys and enlighten me with the app that I have described above :eek:
 
The trickiest part here is interacting with the computer, but I have an idea: code a java applet to control the printer and bluetooth on the PC and then listen for requests from the phone. Then the app would connect to that applet and do the work. Of course that's a hell lot easier to say than code...

I have no idea how to make the java applet work with bluetooth and the printer, maybe using some windows-specific language (and creating a simple windows app instead of a java applet) would be easier.

Your teacher should've told you more details, are you even familiar with both java and windows programming? If not then this is quite a bad homework...

Good luck.
 
  • Like
Reactions: ashishthehunk
I have found the following code on the net, but its not running on my virtual android 2.2 machine. Its always giving "Force close" error.

PrintUtils.java

package com.rcreations.testprint;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io_OutputStream;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Picture;
import android.net.Uri;
import android.os.Environment;
import android.util.Log;



public class PrintUtils
{
// for logging
private static final String TAG = PrintUtils.class.getSimpleName();

// Send 2 Printer package name
private static final String PACKAGE_NAME = "com.rcreations.send2printer";

// intent action to trigger printing
public static final String PRINT_ACTION = "com.rcreations.send2printer.print";

// content provider for accessing images on local sdcard from within html content
// sample img src shoul be something like "content://s2p_localfile/sdcard/logo.gif"
public static final String LOCAL_SDCARD_CONTENT_PROVIDER_PREFIX = "content://s2p_localfile";


/**
* Returns true if "Send 2 Printer" is installed.
*/
public static boolean isSend2PrinterInstalled( Context context )
{
boolean output = false;
PackageManager pm = context.getPackageManager();
try {
PackageInfo pi = pm.getPackageInfo( PACKAGE_NAME, 0 );
if( pi != null )
{
output = true;
}
} catch (PackageManager.NameNotFoundException e) {}
return output;
}


/**
* Launches the Android Market page for installing "Send 2 Printer"
* and calls "finish()" on the given activity.
*/
public static void launchMarketPageForSend2Printer( final Activity context )
{
AlertDialog dlg = new AlertDialog.Builder( context )
.setTitle("Install Send 2 Printer")
.setMessage("Before you can print to a network printer, you need to install Send 2 Printer from the Android Market.")
.setPositiveButton( android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick( DialogInterface dialog, int which )
{
// launch browser
Uri data = Uri.parse( "http://market.android.com/search?q=pname:" + PACKAGE_NAME );
Intent intent = new Intent( android.content.Intent.ACTION_VIEW, data );
intent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP );
context.startActivity( intent );

// exit
context.finish();
}
} )
.show();
}


/**
* Save the given picture (contains canvas draw commands) to a file for printing.
*/
public static File saveCanvasPictureToTempFile( Picture picture )
{
File tempFile = null;

// save to temporary file
File dir = getTempDir();
if( dir != null )
{
FileOutputStream fos = null;
try
{
File f = File.createTempFile( "picture", ".stream", dir );
fos = new FileOutputStream( f );
picture.writeToStream( fos );
tempFile = f;
}
catch( IOException e )
{
Log.e( TAG, "failed to save picture", e );
}
finally
{
close( fos );
}
}

return tempFile;
}


/**
* Sends the given picture file (returned from {@link #saveCanvasPictureToTempFile}) for printing.
*/
public static boolean queuePictureStreamForPrinting( Context context, File f )
{
// send to print activity
Uri uri = Uri.fromFile( f );
Intent i = new Intent( PRINT_ACTION );
i.setDataAndType( uri, "application/x-android-picture-stream" );
i.putExtra( "scaleFitToPage", true );
context.startActivity( i );

return true;
}


/**
* Save the given Bitmap to a file for printing.
* Note: Bitmap can be result of canvas draw commands.
*/
public static File saveBitmapToTempFile( Bitmap b, Bitmap.CompressFormat format )
throws IOException, UnknownFormatException
{
File tempFile = null;

// save to temporary file
File dir = getTempDir();
if( dir != null )
{
FileOutputStream fos = null;
try
{
String strExt = null;
switch( format )
{
case PNG:
strExt = ".pngx";
break;

case JPEG:
strExt = ".jpgx";
break;

default:
throw new UnknownFormatException( "unknown format: " + format );
}
File f = File.createTempFile( "bitmap", strExt, dir );
fos = new FileOutputStream( f );
b.compress( format, 100, fos );
tempFile = f;
}
finally
{
close( fos );
}
}

return tempFile;
}


/**
* Sends the given image file for printing.
*/
public static boolean queueBitmapForPrinting( Context context, File f, Bitmap.CompressFormat format )
throws UnknownFormatException
{
String strMimeType = null;
switch( format )
{
case PNG:
strMimeType = "image/png";
break;

case JPEG:
strMimeType = "image/jpeg";
break;

default:
throw new UnknownFormatException( "unknown format: " + format );
}

// send to print activity
Uri uri = Uri.fromFile( f );
Intent i = new Intent( PRINT_ACTION );
i.setDataAndType( uri, strMimeType );
i.putExtra( "scaleFitToPage", true );
i.putExtra( "deleteAfterPrint", true );
context.startActivity( i );

return true;
}


/**
* Sends the given text for printing.
*/
public static boolean queueTextForPrinting( Context context, String strContent )
{
// send to print activity
Intent i = new Intent( PRINT_ACTION );
i.setType( "text/plain" );
i.putExtra( Intent.EXTRA_TEXT, strContent );
context.startActivity( i );

return true;
}


/**
* Save the given text to a file for printing.
*/
public static File saveTextToTempFile( String text )
throws IOException
{
File tempFile = null;

// save to temporary file
File dir = getTempDir();
if( dir != null )
{
FileOutputStream fos = null;
try
{
File f = File.createTempFile( "text", ".txt", dir );
fos = new FileOutputStream( f );
fos.write( text.getBytes() );
tempFile = f;
}
finally
{
close( fos );
}
}

return tempFile;
}


/**
* Sends the given text file for printing.
*/
public static boolean queueTextFileForPrinting( Context context, File f )
{
// send to print activity
Uri uri = Uri.fromFile( f );
Intent i = new Intent( PRINT_ACTION );
i.setDataAndType( uri, "text/plain" );
i.putExtra( "deleteAfterPrint", true );
context.startActivity( i );

return true;
}


/**
* Sends the given html for printing.
*
* You can also reference a local image on your sdcard using the "content://s2p_localfile" provider.
* For example: <img src="content://s2p_localfile/sdcard/logo.gif">
*/
public static boolean queueHtmlForPrinting( Context context, String strContent )
{
// send to print activity
Intent i = new Intent( PRINT_ACTION );
i.setType( "text/html" );
i.putExtra( Intent.EXTRA_TEXT, strContent );
context.startActivity( i );

return true;
}


/**
* Sends the given html URL for printing.
*
* You can also reference a local file on your sdcard using the "content://s2p_localfile" provider.
* For example: "content://s2p_localfile/sdcard/test.html"
*/
public static boolean queueHtmlUrlForPrinting( Context context, String strUrl )
{
// send to print activity
Intent i = new Intent( PRINT_ACTION );
//i.setDataAndType( Uri.parse(strUrl), "text/html" );// this crashes!
i.setType( "text/html" );
i.putExtra( Intent.EXTRA_TEXT, strUrl );
context.startActivity( i );

return true;
}


/**
* Save the given html content to a file for printing.
*/
public static File saveHtmlToTempFile( String html )
throws IOException
{
File tempFile = null;

// save to temporary file
File dir = getTempDir();
if( dir != null )
{
FileOutputStream fos = null;
try
{
File f = File.createTempFile( "html", ".html", dir );
fos = new FileOutputStream( f );
fos.write( html.getBytes() );
tempFile = f;
}
finally
{
close( fos );
}
}

return tempFile;
}


/**
* Sends the given html file for printing.
*/
public static boolean queueHtmlFileForPrinting( Context context, File f )
{
// send to print activity
Uri uri = Uri.fromFile( f );
Intent i = new Intent( PRINT_ACTION );
i.setDataAndType( uri, "text/html" );
i.putExtra( "deleteAfterPrint", true );
context.startActivity( i );

return true;
}


/**
* Return a temporary directory on the sdcard where files can be saved for printing.
* @return null if temporary directory could not be created.
*/
public static File getTempDir()
{
File dir = new File( Environment.getExternalStorageDirectory(), "temp" );
if( dir.exists() == false && dir.mkdirs() == false )
{
Log.e( TAG, "failed to get/create temp directory" );
return null;
}
return dir;
}


/**
* Helper method to close given output stream ignoring any exceptions.
*/
public static void close( OutputStream os )
{
if( os != null )
{
try
{
os.close();
}
catch( IOException e ) {}
}
}


/**
* Thrown by bitmap methods where the given Bitmap.CompressFormat value is unknown.
*/
public static class UnknownFormatException extends Exception
{
public UnknownFormatException( String msg )
{
super( msg );
}
}
}
 
MainActivity.java

package com.rcreations.testprint;

import java.io.File;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Picture;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

/**
* Various print samples.
*/
public class MainActivity extends Activity
{
private static final String TAG = MainActivity.class.getSimpleName();

static final String HELLO_WORLD = "Hello World";


/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//
// check for and install Send 2 Printer if needed
//

if( PrintUtils.isSend2PrinterInstalled(this) == false )
{
PrintUtils.launchMarketPageForSend2Printer( this );
return;
}

//
// setup GUI buttons
//

Button btnTestCanvas = (Button)findViewById( R.id.btnTestCanvas );
btnTestCanvas.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v)
{
printCanvasExample();
}
});

Button btnTestCanvasAsBitmap = (Button)findViewById( R.id.btnTestCanvasAsBitmap );
btnTestCanvasAsBitmap.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v)
{
printCanvasAsBitmapExample();
}
});

Button btnTestText = (Button)findViewById( R.id.btnTestText );
btnTestText.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v)
{
printTextExample();
}
});

Button btnTestHtml = (Button)findViewById( R.id.btnTestHtml );
btnTestHtml.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v)
{
printHtmlExample();
}
});

Button btnTestHtmlUrl = (Button)findViewById( R.id.btnTestHtmlUrl );
btnTestHtmlUrl.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v)
{
printHtmlUrlExample();
}
});

Button btnTestTextFile = (Button)findViewById( R.id.btnTestTextFile );
btnTestTextFile.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v)
{
printTextFileExample();
}
});

Button btnTestHtmlFile = (Button)findViewById( R.id.btnTestHtmlFile );
btnTestHtmlFile.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v)
{
printHtmlFileExample();
}
});
}


/**
* Send canvas draw commands for printing.
* NOTE: Android 1.5 does not properly support drawBitmap() serialize/deserialize across process boundaries.
* If you need to draw bitmaps, then see the {@link #printCanvasAsBitmapExample()} example.
*/
void printCanvasExample()
{
// create canvas to render on
Picture picture = new Picture();
Canvas c = picture.beginRecording( 240, 240 );

// fill background with WHITE
c.drawRGB( 0xFF, 0xFF, 0xFF );

// draw text
Paint p = new Paint();
Typeface font = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD);
p.setTextSize( 18 );
p.setTypeface( font );
p.setAntiAlias(true);
Rect textBounds = new Rect();
p.getTextBounds( HELLO_WORLD, 0, HELLO_WORLD.length(), textBounds );
int x = (c.getWidth() - (textBounds.right-textBounds.left)) / 2;
int y = (c.getHeight() - (textBounds.bottom-textBounds.top)) / 2;
c.drawText( HELLO_WORLD, x, y, p );

// draw icon
Bitmap icon = BitmapFactory.decodeResource( getResources(), R.drawable.icon );
c.drawBitmap( icon, 0, 0, null );

// stop drawing
picture.endRecording();

// queue canvas for printing
File f = PrintUtils.saveCanvasPictureToTempFile( picture );
if( f != null )
{
PrintUtils.queuePictureStreamForPrinting( this, f );
}
}


/**
* Draw to a bitmap and then send the bitmap for printing.
*/
void printCanvasAsBitmapExample()
{
// create canvas to render on
Bitmap b = Bitmap.createBitmap( 240, 240, Bitmap.Config.RGB_565 );
Canvas c = new Canvas( b );

// fill background with WHITE
c.drawRGB( 0xFF, 0xFF, 0xFF );

// draw text
Paint p = new Paint();
Typeface font = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD);
p.setTextSize( 18 );
p.setTypeface( font );
p.setAntiAlias(true);
Rect textBounds = new Rect();
p.getTextBounds( HELLO_WORLD, 0, HELLO_WORLD.length(), textBounds );
int x = (c.getWidth() - (textBounds.right-textBounds.left)) / 2;
int y = (c.getHeight() - (textBounds.bottom-textBounds.top)) / 2;
c.drawText( HELLO_WORLD, x, y, p );

// draw icon
Bitmap icon = BitmapFactory.decodeResource( getResources(), R.drawable.icon );
c.drawBitmap( icon, 0, 0, null );

// queue bitmap for printing
try
{
File f = PrintUtils.saveBitmapToTempFile( b, Bitmap.CompressFormat.PNG );
if( f != null )
{
PrintUtils.queueBitmapForPrinting( this, f, Bitmap.CompressFormat.PNG );
}
}
catch( Exception e )
{
Log.e( TAG, "failed to save/queue bitmap", e );
}
}


/**
* Send text for printing.
*/
void printTextExample()
{
PrintUtils.queueTextForPrinting( this, HELLO_WORLD );
}


/**
* Send html for printing.
*/
void printHtmlExample()
{
StringBuilder buf = new StringBuilder();
buf.append( "<html>" );
buf.append( "<body>" );
buf.append( "<h1>" ).append( HELLO_WORLD ).append( "</h1>" );
buf.append( "<p>" ).append( "blah blah blah..." ).append( "</p>" );
buf.append( "<p><img src=\"http://www.google.com/intl/en_ALL/images/logo.gif\" /></p>" );
// you can also reference a local image on your sdcard using the "content://s2p_localfile" provider (see below)
//buf.append( "<p><img src=\"content://s2p_localfile/sdcard/logo.gif\" /></p>" );
buf.append( "</body>" );
buf.append( "</html>" );

PrintUtils.queueHtmlForPrinting( this, buf.toString() );
}


/**
* Send html URL for printing.
*/
void printHtmlUrlExample()
{
PrintUtils.queueHtmlUrlForPrinting( this, "http://www.google.com" );
}


/**
* Send text file for printing.
*/
void printTextFileExample()
{
try
{
File f = PrintUtils.saveTextToTempFile( HELLO_WORLD );
if( f != null )
{
PrintUtils.queueTextFileForPrinting( this, f );
}
}
catch( Exception e )
{
Log.e( TAG, "failed to save/queue text", e );
}
}


/**
* Send html file for printing.
*/
void printHtmlFileExample()
{
try
{
StringBuilder buf = new StringBuilder();
buf.append( "<html>" );
buf.append( "<body>" );
buf.append( "<h1>" ).append( HELLO_WORLD ).append( "</h1>" );
buf.append( "<p>" ).append( "blah blah blah..." ).append( "</p>" );
buf.append( "<p><img src=\"http://www.google.com/intl/en_ALL/images/logo.gif\" /></p>" );
// you can also reference a local image on your sdcard using the "content://s2p_localfile" provider (see below)
//buf.append( "<p><img src=\"content://s2p_localfile/sdcard/logo.gif\" /></p>" );
buf.append( "</body>" );
buf.append( "</html>" );

File f = PrintUtils.saveHtmlToTempFile( buf.toString() );
if( f != null )
{
PrintUtils.queueHtmlFileForPrinting( this, f );
}
}
catch( Exception e )
{
Log.e( TAG, "failed to save/queue html", e );
}
}


}
 
There were two parts given on that site, and I have mentioned both above. I am using eclipse for compiling and running the code. I am able to debug all the errors of the code, but still on running the code on the virtual android machine, its giving some "Force close" error and the app is forced to be closed. Now what modifications does the above code needs? Do I need to write some another part of the app? Please enlighten me with the same :)