2014-03-25 75 views
1

基本上我右鍵單擊了我的項目名稱併成功創建了一個名爲pdfs的新文件夾。我想在這裏預先加載一些pdf文件,所以我怎樣從我的mainactivity類中調用這個路徑/ somepdffile.pdf;從android工作區文件夾調用文件路徑

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

回答

0

其更好地把它們的資產/文件夾,這樣你就可以用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()); 
    } 
+0

你沒有在你的方法中使用File文件,你只是創建它? – raklar

+0

@raklar與此,你得到的InputStream,所以你可以閱讀文件,並做它你想要的內容 – BamsBamx

+0

@raklar在你的情況下,你可以用OutputStream寫PDF文件到SDCard,然後傳遞文件路徑你的意圖 – BamsBamx

0

如果你移動你的PDF轉換爲assets/,您可以使用AssetManager檢索他們的InputStream

如果你的目標是在第三方PDF查看器來顯示他們 - 爲您的代碼將建議 - 那麼你可以:

  • 複製從資產到外部存儲卡,在PDF中如果你的代碼的其餘部分會工作,或

  • 複製從資產到內部存儲的PDF,然後使用FileProvider發佈它的PDF閱讀器,或

  • 使用my StreamProvider到公共區域SH從FileProvider資產

覆蓋PDF直接在瀏覽器應用程序可以在​​找到。我的StreamProvider基於Google的FileProvider,其工作原理與此類似。

+0

你能在上面的課上實現嗎? – raklar

0

您的新建文件夾將被建設者完全忽略。它不會與您的應用程序一起打包並複製到任何模擬器或設備上。如果您想要將數據打包到應用程序中,則需要使用原始或資產文件夾。後者允許子文件夾,所以你可以將你的pdf文件夾移動到那裏。

下面是一些代碼,將在您的應用的指定外部目錄下將文件從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();   
} 
+0

以及如何從那裏調用它? – raklar

+0

我用一些代碼更新了我的答案。這些文件將被放入應用程序外部目錄的子目錄中。在我的設備上,即「/ storage/sdcard0/Android/data /」,但您應該始終使用getExternalFilesDir()進行訪問。 – scottt