1

Ich erstelle eine Reihe von Textdateien, die ich wie im folgenden Code erstellt habe. Ich habe diese Dateien im internen Speicher gespeichert. Mein Ziel ist es jetzt, es in ListView anzuzeigen und wenn der Benutzer auf ein Element klickt, das es öffnen soll, oder die Datei per Absicht senden (z. B. E-Mail).Share Text-Datei über Intent aus dem internen Speicher

static void createFile (Context context) { 
    mTimeStamp = String.valueOf(System.currentTimeMillis()/1000); 
    try { 
     String fileName = "File_" + mTimeStamp + ".txt"; 
     mContext = context; 
     mOutputStreamWriter = new 
     OutputStreamWriter(context.openFileOutput(fileName ,Context.MODE_PRIVATE)); 
     String path = mContext.getFilesDir().getAbsolutePath(); 
     Toast.makeText(mContext, "Creating file: " + path, 
     Toast.LENGTH_LONG).show(); 

    } catch (FileNotFoundException e) { 
     Log.e(TAG,"Error with creating file writer..."); 
     e.printStackTrace(); 
    } 
} 

static void writeToFileData(String dataToSave) { 
    try { 
     Toast.makeText(mContext, "Saving data to file: " + dataToSave, Toast.LENGTH_SHORT).show(); 
     mOutputStreamWriter.write(dataToSave); 
    } catch (IOException e) { 
     Log.e(TAG,"Error with writing to file..."); 
     e.printStackTrace(); 
    } 
} 

static void closeFileWriter() { 
    try { 
     Toast.makeText(mContext, "Closing file... ", Toast.LENGTH_SHORT).show(); 
     mOutputStreamWriter.close(); 

    } catch (IOException e) { 
     Log.e(TAG,"Error with closing file writer..."); 
     e.printStackTrace(); 
    } 
} 

Dann führe ich meine alle Dateien wie diese (nicht in Listview aber nur für Test jetzt):

static void testDispFiles (Context context) { 
    mContext = context; 
    String path = mContext.getFilesDir().getAbsolutePath(); 
    Log.v(TAG, "testDisp path: " + path); 
    File dirFile = new File(path); 

    File[] files = dirFile.listFiles(); 
    Log.v(TAG, "testDisp length: " + files.length); 

    for (File f: files) { 
     Log.v(TAG, "testDisp file: " + f.getName()); 
    } 
} 

Und nun möchte ich eine der Dateien teilen, indem sie durch beispielsweise das Senden Email. Wie sende ich die Textdatei aus dem internen Speicher mit Absicht?

// Edit:

ich schaffen eine Absicht, die den Toast Rückkehr-Nachricht von Google Mail-App „Sie können diese Datei nicht hinzufügen“.

String path = mContext.getFilesDir().getAbsolutePath(); 
File f = new File(path); 
File[] files = f.listFiles(); 
Uri data = Uri.fromFile(files[0]); 
Intent i = new Intent(Intent.ACTION_SEND); 
i.putExtra(Intent.EXTRA_STREAM,data); 
i.setType("plain/text"); 
i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
i.setFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); 
startActivity(i); 
+0

Sie können TinyDB verwenden String in den internen Speicher zu speichern, und dann kann es bekommen: TinyDB.class [hier] (https : //github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo/blob/master/TinyDB.java) –

+0

Verwenden Sie 'FileProvider': https://developer.android.com/reference/android/support/ v4/content/FileProvider.html – CommonsWare

+0

@CommonsWare Könnten Sie mir dabei helfen? Ich benutze nie den FileProvider. – chebad

Antwort

1

Sie speichern Sie Ihre Dateien openFileOutput() verwendet, die in der Tat in internen privaten Speicher Ihrer Anwendung ist. Wie getFilesDir().

Keine anderen Apps haben Zugriff.

Wenn Sie die Dateien freigeben möchten, müssen Sie sie mit einem Dateianbieter bereitstellen.

Im übrigen ist das Teilen einer Datei eine Standardaktion.

Sie können den Code überall finden.

+0

Können Sie mir mit diesem helfen? Weil ich nie Dateianbieter verwende und ich nicht weiß, wie ich damit arbeiten soll. – chebad

+0

Google dafür. Sie können überall Code finden. – greenapps

+0

Sie könnten einfach mit Code für die gemeinsame Absicht beginnen. Bitte posten. Google für Intent.ACTION.SEND und Intent.EXTRA_STREAM. – greenapps

0

Ich habe eine der Lösung für dieses Problem gefunden. Wie @CommonsWare vorgeschlagen hat, habe ich einen FileProvider verwendet. Ich folge diesem example. Aber in provider_paths.xml Ich habe diesen Code, weil ich einen internen Speicher verwenden.

<Paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <files-path name="files" path="."/> 
</Paths> 

Dann Aktivität sende ich eine Datei über Absicht wie folgt aus:

 Uri path = FileProvider.getUriForFile(this,"same_authoritory_which_was_in_manifest", new File(FILE_TO_SAVE.getPath())); 
     Intent i = new Intent(Intent.ACTION_SEND); 
     i.putExtra(Intent.EXTRA_TEXT, "Test"); 
     i.putExtra(Intent.EXTRA_STREAM, path); 
     i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
     i.setType("plain/*"); 
     startActivity(i); 
Verwandte Themen