从android工作区文件夹调用文件路径

时间:2014-03-25 23:04:12

标签: android path

基本上我已经右键单击了我的项目名称并成功创建了一个名为pdfs的新文件夹。我想在这里预先加载一些pdf文件,那么如何从我的mainactivity类调用这个path / somepdffile.pdf;

import java.io.File;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class FullscreenActivity extends Activity {

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_fullscreen);

  Button button = (Button) findViewById(R.id.bPressMe);

  button.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {

    File pdfFile = new File(Environment
      .getExternalStorageDirectory(), "pdfs/2pg.pdf");

    try {
     if (pdfFile.exists()) {
      Uri path = Uri.fromFile(pdfFile);
      Intent objIntent = new Intent(Intent.ACTION_VIEW);
      objIntent.setDataAndType(path, "application/pdf");
      objIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      startActivity(objIntent);
     } else {
      Toast.makeText(FullscreenActivity.this, "File NotFound",
        Toast.LENGTH_SHORT).show();
     }
    } catch (ActivityNotFoundException e) {
     Toast.makeText(FullscreenActivity.this,
       "No Viewer Application Found", Toast.LENGTH_SHORT)
       .show();
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  });

 }

}

explorer

3 个答案:

答案 0 :(得分:0)

最好将它们放在assets /文件夹中,这样您就可以使用AssetManager访问它们了。像这样的东西

    AssetManager assetManager = getAssets();

    InputStream in = null;
    OutputStream out = null;
    File file = new File(getFilesDir(), "name_of_pdf_file.pdf");
    try
    {
        in = assetManager.open("name_of_pdf_file.pdf");

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

答案 1 :(得分:0)

如果您将PDF移至assets/,则可以使用AssetManager为其检索InputStream

如果您的目标是在第三方PDF查看器中显示它们 - 正如您的代码所示 - 那么您可以:

  • 将资产中的PDF复制到外部存储中,在这种情况下,其余代码可以正常工作,或者

  • 将PDF从资产复制到内部存储,然后使用FileProvider将其发布到PDF查看器,或

  • 使用my StreamProvider直接从资源将PDF发布到查看器应用

FileProvider的覆盖范围可在the Android documentation中找到。我的StreamProvider基于Google的FileProvider,效果相似。

答案 2 :(得分:0)

构建器将完全忽略您的新文件夹。它不会与您的应用程序一起打包并复制到任何模拟器或设备上。如果要使用应用程序打包数据,则需要使用raw或assets文件夹。后者允许子文件夹,因此您可以在那里移动pdfs文件夹。

以下是一些代码,可以将文件从assets/pdfs移动到应用指定外部目录下的files/pdfs

final static String TAG = "MainActivity";
final static int BUFF_SIZE = 2048;

private void copyPdfs() {
    AssetManager assetManager = getAssets();
    String[] pdfs = null;
    try {
        pdfs = assetManager.list("pdfs");
    } catch (IOException e) {
        e.printStackTrace();
        Log.e(TAG, "Unable to get list of PDFs!");
    }

    File pdfDir = new File(getExternalFilesDir(null), "pdfs");
    if (!pdfDir.exists()) {
        Log.d(TAG, "Creating directory " + pdfDir.getAbsolutePath());
        pdfDir.mkdirs();
    }

    for (String pdf : pdfs) {
        Log.d(TAG, "Copying " + pdf);
        InputStream in = null;
        OutputStream out = null;

        try {
            in = assetManager.open("pdfs" + File.separator +  pdf);
            out = new FileOutputStream(new File(pdfDir, pdf));

            copyPdf(in, out);

            out.close();
            in.close();

        } catch (IOException e) {
            e.printStackTrace();
            Log.e(TAG, "Unable to copy PDF!");
        }
    }
}

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

    out.flush();        
}