如何通过HP ePrint App从Android手机打印HTML文件或图像?

时间:2014-04-01 09:46:29

标签: android

我的概念想要从Android应用程序打印,我尝试了很多方式然后最终我得到了一些解决方案,我尝试使用HP ePrint应用程序打印HTML文件。在此代码中,我们可以将文本文件或html文件或图像发送到HP ePrint APP进行打印,但Text文件工作正常。我想发送HTML文件不起作用。它显示出一些错误。

MainActivity.java

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.text.Html;
import android.util.Log;
import android.view.View;
import android.widget.Button;

/**
 * Various print samples.
 */
public class MainActivity extends Activity {

    String text = "private static final String  TAG = MainActivity.class.getSimpleName();";

    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()
    {
        //CharSequence styledText = Html.fromHtml(text);
        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
        {
            //CharSequence styledText = Html.fromHtml(text);            
            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\" /></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 );
        }
    }
}

PrintUtils.java

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;


/**
 * Static methods to detect, install, and print to a network printer with Android.
 */
public class PrintUtils {
    static Activity myMainActivity;
    // for logging
    private static final String TAG = PrintUtils.class.getSimpleName();

    // Send 2 Printer package name
    private static final String PACKAGE_NAME = "com.hp.android.print";

    // intent action to trigger printing
    public static final String PRINT_ACTION = "org.androidprinting.intent.action.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 HP ePrint")
        .setMessage("Before you can print to a network printer, you need to install HP ePrinter 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);
        myMainActivity.startActivityForResult(i, 0);
        //((Activity) context).startActivityForResult(i, 0);
        return true;
    }

   /*
    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;
    }
    */

    /**
     * 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 );
        }
    }
}

记录错误

enter image description here

1 个答案:

答案 0 :(得分:0)

您尚未初始化myMainActivity,但正尝试在其上调用方法:

myMainActivity.startActivityForResult(i, 0);