在android中实现pdf阅读器时出错

时间:2014-10-07 20:59:55

标签: android eclipse pdf android-asynctask

我是android新手,我正试图从服务器上读取pdf。我找到了不同的方法,并尝试了大部分方法。我尝试使用webview,使用谷歌文档,但没有什么适合我。我不喜欢使用其他第三方或插件。

我发现这个代码工作正常,但它从assets文件夹中读取。

    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_books_view);
CopyReadAssets();
}

    private void CopyReadAssets()
    {

        AssetManager assetManager = getAssets();

        InputStream in = null;
        OutputStream out = null;
        File file = new File(getFilesDir(), "test.pdf");
        try
        {
            in = assetManager.open("test.pdf");
            out = openFileOutput(file.getName(), Context.MODE_WORLD_READABLE);

            copyFile(in, out);
            in.close();
            in = null;
            out.flush();
            out.close();
            out = null;
        } catch (Exception e)
        {
            Log.e("tag", e.getMessage());
        }

        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(
                Uri.parse("file://" + getFilesDir() + "/test.pdf"),
                "application/pdf");

        startActivity(intent);
    }


    private void copyFile(InputStream in, OutputStream out) throws IOException
    {
        byte[] buffer = new byte[1024];
        int read;
        while ((read = in.read(buffer)) != -1)
        {
            out.write(buffer, 0, read);
        }
    }

我尝试将其修改为:

public class TestActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        //Call an AsycTask so you don't lock the main UI thread 
        new RequestTask().execute(); 

    }//end onCreate

    private class RequestTask extends AsyncTask<String, String, String> 
    {
        //Background task 
        protected String doInBackground(String... uri) 
        { 
            //Stuff you do in background goes here 
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response;
            String responseString = null;
            //-------
            String fileName="test";
            String fileExtension=".pdf";
            try 
            {
            URL url = new URL("my url");
            HttpURLConnection c = (HttpURLConnection) url.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();
            String PATH = Environment.getExternalStorageDirectory() + "/mydownload/";
            File file = new File(PATH);
            file.mkdirs();
            File outputFile = new File(file, fileName+fileExtension);
            FileOutputStream fos = new FileOutputStream(outputFile);
            InputStream is = c.getInputStream();
            byte[] buffer = new byte[1024];
            int len1 = 0;
            while ((len1 = is.read(buffer)) != -1) {
                fos.write(buffer, 0, len1);
            }
            responseString = fos.toString();
            fos.flush();
            fos.close();
            is.close();
            }
            catch (ClientProtocolException e) 
            {
                //TODO Handle problems..
            } 
            catch (IOException e) 
            {
                //TODO Handle problems..
            }

            return responseString;
        } 
        @Override
        protected void onPostExecute(String result) 
        {
            super.onPostExecute(result);
            //Do anything with response..
            //Stuff you do after the asych task is done

            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(
                    Uri.parse(result),
                    "application/pdf");

            startActivity(intent);
        }
    } //end RequestTask class

但它给了我一个祝酒词: ((不是受支持的文档类型))

有人可以帮助我吗,我花了差不多整整一天试图弄清楚问题。

2 个答案:

答案 0 :(得分:0)

您必须使用HttpClient执行pdf文件的GET请求。这是返回String缓冲区的示例,您必须重新排列以在读取远程文件后创建PDF

 class RequestTask extends AsyncTask<String, String, String>{

        @Override
        protected String doInBackground(String... uri) {
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response;
            String responseString = null;
            try {
                response = httpclient.execute(new HttpGet(uri[0]));
                StatusLine statusLine = response.getStatusLine();
                if(statusLine.getStatusCode() == HttpStatus.SC_OK){
                    ByteArrayOutputStream out = new ByteArrayOutputStream();
                    response.getEntity().writeTo(out);
                    out.close();
                    responseString = out.toString();
                } else{
                    //Closes the connection.
                    response.getEntity().getContent().close();
                    throw new IOException(statusLine.getReasonPhrase());
                }
            } catch (ClientProtocolException e) {
                //TODO Handle problems..
            } catch (IOException e) {
                //TODO Handle problems..
            }
            return responseString;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            //Do anything with response..
        }
    }

比你可以打电话

   new RequestTask().execute(url);

答案 1 :(得分:0)

我使用此代码将整体更改为更简单的方法

        //setContentView(R.layout.activity_main);
        WebView webView=new WebView(GeneralHealthEducationArBooksViewActivity.this);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setPluginState(PluginState.ON);

        //---you need this to prevent the webview from
        // launching another browser when a url
        // redirection occurs---
        webView.setWebViewClient(new Callback());

        String pdfURL = "your link";
        webView.loadUrl(
"http://docs.google.com/gview?embedded=true&url=" + pdfURL);

        setContentView(webView);

xml文件

<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/webview"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >


</WebView>

最后,pdf显示:)