1

私は以下のコードのように作成したテキストファイルをたくさん作成します。これらのファイルを内部ストレージに保存しました。私の目標は、ListViewに表示することです。ユーザーが項目をクリックすると、その内容を意図した方法で開くか送信します(電子メールなど)。内部ストレージからインテント経由でテキストファイルを共有

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

そして今、私は、例えばを通してそれを送信することによって、のいずれかのファイルを共有したい:

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

は、その後、私はこの(ないListViewの中だけで、今テスト用)のように、私のすべてのファイルを一覧表示しますEメール。インテント経由で内部ストレージからテキストファイルを送信するには?

//編集:

私はGmailアプリからのメッセージ「は、このファイルを追加することはできません」トーストを返す意思を作成します。

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

あなたは内部ストレージに文字列を格納するのにTinyDBを使用することができますし、それを得ることができます:TinyDB.class [ここ](HTTPS

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

は、その後の活動に私はこのような意図を経由してファイルを送信します://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo/blob/master/TinyDB.java) –

+0

'FileProvider'を使用してください:https://developer.android.com/reference/android/support/ v4/content/FileProvider.html – CommonsWare

+0

@CommonsWareこれを手伝ってもらえますか?私はFileProviderを使用しません。 – chebad

答えて

1

あなたはあなたのアプリケーションの内部プライベートメモリに実際にあるopenFileOutput()を使用してファイルを保存します。 getFilesDir()のように。

他のアプリにアクセスできません。

ファイルを共有する場合は、ファイルプロバイダを使用してファイルを提供する必要があります。

ファイルを共有する残りの部分は、標準的な動作です。

あなたはどこにでもコードを見つけることができます。

+0

これを手伝ってもらえますか?私は決してファイルプロバイダを使用しないので、私はどのようにそれを扱うのか分かりません。 – chebad

+0

Google。あなたはどこにでもコードを見つけることができます。 – greenapps

+0

共有インテントのコードから始めてください。投稿してください。 Google for Intent.ACTION.SENDとIntent.EXTRA_STREAM。 – greenapps

0

この問題の解決策の1つが見つかりました。 @CommonsWareが私がFileProviderを使用することをどのように提案したのですか?私はこれに従うexample。しかし、provider_paths.xml私は内部ストレージを使用しているので、私はこのコードを置く。

 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); 
関連する問題