2012-06-11 10 views
9

मैं myfile.pdf नामक फ़ाइल में assets निर्देशिका में संग्रहीत फ़ाइल के संदर्भ को पुनर्प्राप्त करने का प्रयास कर रहा हूं। मैं इस प्रकार यह करने के लिए प्रयास किया है:एंड्रॉइड - संपत्तियों से एक्सेस फ़ाइल पीडीएफ डिस्प्ले

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

किसी तरह, मैं false जब myfile.pdf कर assets निर्देशिका में मौजूद है। मैंने इसे getAssets().list("") और Log.d() लौटाए गए सरणी में प्रत्येक तत्व का उपयोग करके सत्यापित किया।

जिनमें से अधिकतर, मैं पीडीएफ फ़ाइल का संदर्भ प्राप्त करने की कोशिश कर रहा हूं और फिर पीडीएफ देखने के लिए किसी भी पीडीएफ व्यूअर का उपयोग कर रहा हूं, जो पहले से ही डिवाइस पर स्थापित है।

मुझे लगता है कि पिछले मुद्दे के बाद से (फ़ाइल का संदर्भ को पुन: प्राप्त) रिटर्न false तो अगले Snipped कोड में विफल रहता है:

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

किसी को भी एक सुराग कारण है कि मैं फ़ाइल का संदर्भ को पुनः प्राप्त करने में असमर्थ हूँ है ? और मैं पीडीएफ प्रदर्शित करने के लिए पहले से ही स्थापित पीडीएफ व्यूअर का उपयोग क्यों नहीं कर सकता (पीडीएफ फाइल के संदर्भ को पुनः प्राप्त करने के बाद)?

धन्यवाद।

+0

चेक [कैसे करने के लिए खुले एक उदाहरण के लिए के मामले में, पीडीएफ़ के लिए है पीडीएफ संग्रहीत-या तो-इन-रेस-कच्चे या संपत्ति-फ़ोल्डर] (http://stackoverflow.com/questions/6491210/how-to-open-a-pdf-stored-either-in-res- कच्चे-या-संपत्ति-फ़ोल्डर) –

उत्तर

22

जैसा कि बराक ने कहा था कि आप इसे संपत्तियों से आंतरिक भंडारण या एसडी कार्ड में कॉपी कर सकते हैं और इनबिल्ट पीडीएफ अनुप्रयोगों का उपयोग करके वहां से इसे खोल सकते हैं।

निम्नलिखित स्निपेट आपकी मदद करेगा। (मैं करने के लिए लिख सकते हैं और आंतरिक संग्रहण से फ़ाइलों को पढ़ने के लिए इस कोड को अद्यतन किया है।

लेकिन मुझे नहीं इस दृष्टिकोण की सिफारिश क्योंकि पीडीएफ फ़ाइल आकार में 100 एमबी से अधिक हो सकता है।

तो इसके कि विशाल को बचाने के लिए अनुशंसित नहीं आंतरिक भंडारण

इसके अलावा में दायर करते हुए आंतरिक भंडारण करने के लिए फ़ाइल को सहेजने आप

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" />

प्रकट

+1

+1, मुझे अपने उत्तर में कुछ ऐसा ही पोस्ट करना चाहिए था क्योंकि ओपी ने विशेष रूप से खोलने के बारे में पूछा यह अन्य ऐप्स के साथ। – Barak

+0

मैं फ़ाइल को आंतरिक संग्रहण में कैसे लिख सकता हूं (क्योंकि मेरे पास एसडी कार्ड नहीं है)? – EviatarS

+0

अद्यतन उत्तर की जांच करें –

1

आप ऐसा नहीं कर सकते हैं। एपीके में कोई निर्देशिका संरचना नहीं है, यह सिर्फ डेटा है। ढांचा जानता है कि इसे कैसे एक्सेस करें (getAssets), लेकिन आप इसे निर्देशिका में फ़ाइल के रूप में नहीं देख सकते हैं।

आपके पास कोई इनपुट धारा के रूप में खोल सकते हैं ...

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

या आप आंतरिक मेमोरी या SD कार्ड और वहाँ यह उपयोग करने के लिए संपत्ति के बाहर इसे कॉपी कर सकते हैं।

+0

लेकिन मैं HTML फ़ाइलों के लिए ऐसा करने में सक्षम हूं। उदाहरण के लिए, मैं 'संपत्ति' निर्देशिका में HTML फ़ाइलों तक पहुंच सकता हूं और उन्हें 'WebView' पर देख सकता हूं। – EviatarS

+1

मुझे थोड़ा सा खोज लिया, लेकिन मुझे पता चला कि क्यों। यूआरएल "फाइल: /// android_asset /" किसी विशेष निर्देशिका को इंगित नहीं करती है, इसका उपयोग केवल संपत्तियों को संबोधित करने के लिए वेबव्यू द्वारा किया जाता है। खींच लिया कि [यहां] (http://stackoverflow.com/a/3281337/1105376) – Barak

+0

मेरे परिप्रेक्ष्य में सुधार के लिए कई टीएनएक्स :) – EviatarS

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

से पहले उदाहरण .txt

FileOutputStream fos = new FileOutputStream(file); 
संबंधित मुद्दे