この質問にはいくつかのサブ質問が含まれていました。この質問から始めて、これらをフォークしています。この質問を削除して、最終的にクリーンアップします。
次のプログラムは、理論上、hello-world テキスト ファイルを共有します。コードは実行されますが、Dropbox または Gmail への共有 (具体的な例を 2 つだけ示します) は失敗します。
public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String filename = "hellow.txt";
String fileContents = "Hello, World!\n";
byte[] bytes = fileContents.getBytes();
FileOutputStream fos = null;
try {
fos = this.openFileOutput(filename, MODE_PRIVATE);
fos.write(bytes);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
File file = new File(filename);
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
shareIntent.setType("application/txt");
startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));
file.delete();
}
}
res/values/strings.xml に値を追加する以外に、Eclipse が作成send_to
するジェネリックに対して行った唯一の他の変更は、AndroidManifest.xml に次のタグを追加することです。Hello, World
<provider>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.mycorp.helloworldtxtfileprovider.MainActivity"
android:exported="false"
android:grantUriPermissions="true" >
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/my_paths" />
</provider>
<activity
android:name="com.mycorp.helloworldtxtfileprovider.MainActivity"
...
...そして res/xml/my_paths.xml に以下を追加します
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="files" path="." />
</paths>
私の主な質問は最初の質問ですが、このトピックについて話している間に、質問 2 から 4 についての議論も興味深いでしょう。
- 上記のプログラムが失敗するのはなぜですか?
- custom が必要な場合は
ContentProvider
そのクラスを拡張する必要がありますが、 だけが必要な場合はFileProvider
、派生なしでそのクラスを使用できますか? - このコードでは、 を 1
filename
回と で 2 回使用する必要がopenFileOutput
ありましたnew File()
。この重複を回避する方法はありますか (同じファイルが参照されていることを保証します)? - が呼び出された直後にファイルを削除しても安全です
startActivity(..)
か、それともファイルがアップロード/共有されたことを知るのを待つコールバックを考案する必要がありますか? (実際のファイルは、共有/アップロードに時間がかかる場合があります。)
編集
コードは正常に実行され、送信先のアプリのリストが表示されます。
Dropbox を選択すると、問題なく場所を選択できます。Dropbox は、「Dropbox にアップロードしています」という通知に続いて「アップロードに失敗しました: my_file.txt」という通知を送信します。
Gmailを選択すると、受信者を入力でき、ファイルが添付されているように見えますが、「メッセージを送信しています..」の後に「添付ファイルを送信できませんでした」と表示されます。