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 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
Found the above quiet useful. Covers most of what you will need to know for the Application you are developing. This requires time to watch the videos however.
Found the above quiet useful. Covers most of what you will need to know for the Application you are developing. This requires time to watch the videos however.
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.
Last edited by Aluxian; October 10th, 2012 at 11:58 AM.
The Following User Says Thank You to Aluxian For This Useful Post:
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";
/**
* 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 );
}
}
}
Last edited by ashishthehunk; October 12th, 2012 at 03:21 AM.
/**
* 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
//
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 );
// 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 );
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