2014-01-23 11 views
24

Ich probiere ein Beispielprogramm aus, um eine Datei im internen Speicher zu speichern, und öffne sie unter Verwendung von Intent.ACTION_VIEW.Wie öffne ich private Dateien, die mit Intent.ACTION_VIEW im internen Speicher gespeichert wurden?

für die Datei im privaten Modus Speicherung folgte ich die Schritte here. vorgesehen

konnte ich die erstellte Datei in dem internen Speicher bei /data/data/com.storeInternal.poc/files finden. *

Aber wenn ich versuchte, Datei zu öffnen, wird es nicht geöffnet.

Hier finden Sie den Code, den ich dafür verwendet habe.

public class InternalStoragePOCActivity extends Activity { 
    /** Called when the activity is first created. */ 
    String FILENAME = "hello_file.txt"; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     createFile(); 
     openFile(FILENAME); 
    } 

    public FileOutputStream getStream(String path) throws FileNotFoundException { 
     return openFileOutput(path, Context.MODE_PRIVATE); 
    } 

    public void createFile(){ 

     String string = "hello world!"; 
     FileOutputStream fout = null; 
     try { 
      //getting output stream 
      fout = getStream(FILENAME); 
      //writng data 
      fout.write(string.getBytes()); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     }finally{ 
      if(fout!=null){ 
       //closing the output stream 
       try { 
        fout.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 

     } 

    } 

    public void openFile(String filePath) { 
     try { 
      File temp_file = new File(filePath); 

      Uri data = Uri.fromFile(temp_file); 
      String type = getMimeType(data.toString()); 

      Intent intent = new Intent(android.content.Intent.ACTION_VIEW); 
      intent.setDataAndType(data, type); 
      startActivity(intent); 

     } catch (Exception e) { 
      Log.d("Internal Storage POC ", "No Supported Application found to open this file"); 
      e.printStackTrace(); 

     } 
    } 

    public static String getMimeType(String url) { 
     String type = null; 
     String extension = MimeTypeMap.getFileExtensionFromUrl(url); 

     if (extension != null) { 
      MimeTypeMap mime = MimeTypeMap.getSingleton(); 
      type = mime.getMimeTypeFromExtension(extension); 
     } 

     return type; 
    } 
} 

Wie kann ich öffnen Sie die Datei Context.MODE_PRIVATE von jeder anderen bestehenden/geeigneten App gespeichert ist. ZB: file.pdf sollte von PDF - Reader, Video für Video - Player usw. Geöffnet werden.

+0

meine Antwort siehe hier: http://stackoverflow.com/questions/15377373/how-to-put-a-video -file-in-android-custom-content-provider – dangalg

Antwort

46

Sie können eine Datei im internen Speicher, die von einem URI referenziert wird, nicht über eine Absicht mit einer anderen App teilen/teilen. Eine App kann die privaten Daten einer anderen App nicht lesen (es sei denn, sie erfolgt über einen Content Provider). Sie übergeben den URI der Datei in der Absicht (nicht die eigentliche Datei selbst) und die App, die die Absicht empfängt, muss in der Lage sein, von dieser URI zu lesen.

Die einfachste Lösung ist, die Datei zuerst auf externen Speicher zu kopieren und von dort zu teilen. Wenn Sie das nicht möchten, erstellen Sie einen Inhaltsanbieter, um Ihre Datei verfügbar zu machen. Ein Beispiel ist hier zu finden: Create and Share a File from Internal Storage

EDIT: einen Content-Provider zu verwenden:

zunächst wie unten Ihre Content-Provider-Klasse erstellen. Die wichtige Überschreibung hier ist 'openFile'. Wenn Ihr Inhaltsanbieter mit einem Datei-URI aufgerufen wird, wird diese Methode ausgeführt und gibt einen ParcelFileDescriptor zurück. Die anderen Methoden müssen ebenfalls vorhanden sein, da sie in ContentProvider abstrakt sind.

public class MyProvider extends ContentProvider { 

@Override 
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { 
    File privateFile = new File(getContext().getFilesDir(), uri.getPath()); 
    return ParcelFileDescriptor.open(privateFile, ParcelFileDescriptor.MODE_READ_ONLY); 
} 

@Override 
public int delete(Uri arg0, String arg1, String[] arg2) { 
    return 0; 
} 

@Override 
public String getType(Uri arg0) { 
    return null; 
} 

@Override 
public Uri insert(Uri arg0, ContentValues arg1) { 
    return null; 
} 

@Override 
public boolean onCreate() { 
    return false; 
} 

@Override 
public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3, 
     String arg4) { 
    return null; 
} 

@Override 
public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) { 
    return 0; 
} 
} 

Definieren Sie Ihren Anbieter im Manifest innerhalb der Anwendung Tag, mit wahrem exportiert = andere Anwendungen zu erlauben, es zu benutzen:

<provider android:name=".MyProvider" android:authorities="your.package.name" android:exported="true" /> 

Im openfile() Methode, die Sie in Ihrer Aktivität haben, setzen Sie up eine URI wie unten. Diese URI verweist auf den Content-Provider im Paket zusammen mit dem Dateinamen:

Uri uri = Uri.parse("content://your.package.name/" + filePath); 

Schließlich setzt diese uri in der Absicht:

intent.setDataAndType(uri, type); 

Denken Sie daran, Ihre eigenen Paketnamen einfügen, wo ich verwendet habe ' your.package.name 'oben.

+0

Wie kann ich es mit Content-Provider mit der geringsten Änderung verwenden? – Abhinav

+0

Bitte sehen Sie meine Bearbeitung oben. – NigelK

+0

Das hat wie Charme funktioniert! Vielen Dank. –

0
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() 
     + "Foder path" + "/" + "File Name"); 

     Uri uri = Uri.fromFile(file); 
     Intent in = new Intent(Intent.ACTION_VIEW); 
     in.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     in.setDataAndType(uri, "mime type"); 
     startActivity(in); 

[Hinweis: Bitte wählen Sie MIME-Typen wie pro Ihrem Dateityp]

0

Wenn jemand noch ein Problem Gesichter wie: die Datei kann nicht zugegriffen werden. Dies könnte dir helfen. Zusammen mit dem Content-Provider musst du auch folgende Flagge setzen ...

intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

oder

intent.setFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); 

Ich brauche Ruf plz: D

Verwandte Themen