9

assetsという名前のファイルへのディレクトリに保存されているファイルへの参照を取得しようとしていますmyfile.pdf。私は次のようにそれをやろうとしました:

File file = new File("android_assest/myfile.pdf);
Log.d("myTag", "" + file.isFile());

どういうわけか、doがディレクトリに存在するfalseときに取得します。返された配列の各要素を使用して確認しました。myfile.pdfassetsgetAssets().list("")Log.d()

さらに、PDF ファイルへの参照を取得し、デバイスに既にインストールされている PDF ビューアーを使用して、PDF を表示しようとしています。

前の問題 (ファイルへの参照の取得) が返されたfalseので、次の切り取られたコードが失敗したと思います。

Intent i = new Intent(Intent.ACTION_VIEW,
    Uri.parse("file:///android_asset/myfile.pdf"));
startActivity(i);

ファイルへの参照を取得できない理由を知っている人はいますか? また、(PDF ファイルへの参照を取得した後) 既にインストールされている PDF ビューアを使用して PDF を表示できないのはなぜですか?

ありがとう。

4

3 に答える 3

24

Barakが言ったように、アセットから内部ストレージまたはSDカードにコピーし、組み込みのpdfアプリケーションを使用してそこから開くことができます。

次のスニペットが役に立ちます。(このコードを更新して、内部ストレージにファイルを書き込んだり、ファイルを読み取ったりしました。

ただし、PDFファイルのサイズは100 MBを超える可能性があるため、このアプローチはお勧めしません。

したがって、その巨大なファイルを内部ストレージに保存することはお勧めしません

また、使用する内部ストレージにファイルを保存する際にも確認してください

openFileOutput(file.getName(), Context.MODE_WORLD_READABLE);

そうすれば、他のアプリケーションだけがそれを読み取ることができます。

次のスニペットを確認してください。

package org.sample;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.AssetManager;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;

public class SampleActivity extends Activity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        CopyReadAssets();

    }

    private void CopyReadAssets()
    {
        AssetManager assetManager = getAssets();

        InputStream in = null;
        OutputStream out = null;
        File file = new File(getFilesDir(), "git.pdf");
        try
        {
            in = assetManager.open("git.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() + "/git.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);
        }
    }

}

必ず含めてください

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

マニフェストで

于 2012-06-11T13:36:37.443 に答える
1

そんなことはできません。apk にはディレクトリ構造はなく、単なるデータです。フレームワークはそれにアクセスする方法 ( getAssets) を認識していますが、ディレクトリ内のファイルとして検索することはできません。

入力ストリームとして開くことができます...

in = new BufferedReader(new InputStreamReader(activity.getAssets().open(myfile.pdf))); 

または、アセットから内部ストレージまたは SD カードにコピーして、そこからアクセスすることもできます。

于 2012-06-11T13:25:11.040 に答える
0

Vipul Shahと言うように、外部の場合。

import android.app.Activity;
import android.content.Intent;
import android.content.res.AssetManager;
import android.net.Uri;
import android.os.Environment;
import android.os.Bundle;
import android.util.Log;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        copyReadAssets();
    }


    private void copyReadAssets()
    {
        AssetManager assetManager = getAssets();

        InputStream in = null;
        OutputStream out = null;

        String strDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+ File.separator + "Pdfs";
        File fileDir = new File(strDir);
        fileDir.mkdirs();   // crear la ruta si no existe
        File file = new File(fileDir, "example2.pdf");



        try
        {

            in = assetManager.open("example.pdf");  //leer el archivo de assets
            out = new BufferedOutputStream(new FileOutputStream(file)); //crear el archivo


            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://" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + File.separator + "Pdfs" + "/example2.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);
        }
    }
}

次のようにコードの一部を変更します。

out = new BufferedOutputStream(new FileOutputStream(file));

前の例は Pdfs 用で、例の .txt の場合

FileOutputStream fos = new FileOutputStream(file);
于 2015-05-28T21:40:52.873 に答える