iText / Cloud Print не работает на Android

Я пытаюсь создать простой PDF-файл и передать его в Google Cloud Print, но ничего не происходит, когда я пытаюсь распечатать PDF-файл на своем устройстве Google. (Вход в систему работает) Как бы я мог подтвердить, что мой PDF является целым и действительным, для начинающих? Я чувствую, что беру слово iText для этого.

Кроме того, я получаю некоторую ошибку, сообщая мне, что

public class PDFViewer extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    this.getWindow().setSoftInputMode
                  (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    super.onCreate(savedInstanceState);

    InputStream object = this.getResources().openRawResource(R.raw.itextkey);
    LicenseKey.loadLicenseFile(object);

    File root = Environment.getExternalStorageDirectory();

    File f = new File(android.os.Environment.getExternalStorageDirectory()
               .getAbsolutePath() + java.io.File.separator + "HelloWorld.pdf");
    boolean externalStorageAvailable = false;
    boolean externalStorageWriteable = false;
    String state = Environment.getExternalStorageState();
    // if we can read and write to storage
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        externalStorageAvailable = true;
        externalStorageWriteable = true;
    }
    // else if we can read but cannot write
    else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        externalStorageAvailable = true;
        externalStorageWriteable = false;
        } 
    if (externalStorageWriteable) {
        System.out.println("enough storage!");
        // creation of a document-object
        Document document = new Document();
        try {
            // we create a writer that listens to the document
            // and directs a PDF-stream to a file
        if (f.exists())
           f.delete();
        try {
            f.createNewFile();
        } catch (IOException e) {System.out.println(e);}
         PdfWriter.getInstance(document, new FileOutputStream
             (android.os.Environment.getExternalStorageDirectory()
             .getAbsolutePath() + java.io.File.separator + "HelloWorld.pdf"));
     // open + format the document
       document.open();
           document.add(new Paragraph("Hello World"));
      } catch (DocumentException de) {
          System.err.println(de.getMessage());
      } catch (IOException ioe) {
          System.err.println(ioe.getMessage());
      }
       document.close();
   }
   Intent printIntent = new Intent(this, PrintDialogActivity.class);
   Uri hello = Uri.fromFile(f);
   printIntent.setDataAndType(hello, "application / pdf");
   printIntent.putExtra("title", "stuff");
   startActivity(printIntent);

Я получаю эту ошибку, о которой я не знаю, что делать:

04-29 03:41:18.502: E/chromium(749): external/chromium/net/disk_cache
                  /backend_impl.cc:1107: [0429/034118:ERROR:backend_impl.cc(1107)]
                  Critical error found -8

Я хотел бы знать, с чем я могу попытаться поиграть, чтобы заставить это работать. Кстати, PrintDialogActivity есть на сайте Google. Я отключил Exchange в настройках приложения, разрешил запись внешнего хранилища в манифест, и интернет также был включен.

Спасибо

1 ответ

У меня была такая же проблема, пока я не нашел решение на сайте разработчика Android: http://developer.android.com/guide/webapps/webview.html.

targetSdkVersion в AndroidManifest.xml вашего приложения, вероятно, установлено значение 17 или выше. В этом случае вам нужно внести небольшое изменение в PrintDialogActivity что вы получили с сайта Google Developer. Вам нужно добавить аннотацию, @JavascriptInterface к публичным методам в PrintDialogJavaScriptInterface учебный класс.

final class PrintDialogJavaScriptInterface
{
    @JavascriptInterface
    public String getType()
    {
        return cloudPrintIntent.getType();
    }

    @JavascriptInterface
    public String getTitle()
    {
        return cloudPrintIntent.getExtras().getString("title");
    }

    @JavascriptInterface
    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 "";
    }

    @JavascriptInterface
    public String getEncoding()
    {
        return CONTENT_TRANSFER_ENCODING;
    }

    @JavascriptInterface
    public void onPostMessage(String message)
    {
        if (message.startsWith(CLOSE_POST_MESSAGE_NAME))
        {
            finish();
        }
    }
}
Другие вопросы по тегам