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();
}
}
}