私の目標は、内部ストレージにXMLファイルを作成し、それを共有インテントで送信することです。私はこのコード内部ストレージからファイルを作成して共有する
FileOutputStream outputStream = context.openFileOutput(fileName, Context.MODE_WORLD_READABLE);
PrintStream printStream = new PrintStream(outputStream);
String xml = this.writeXml(); // get XML here
printStream.println(xml);
printStream.close();
を使用してXMLファイルを作成することができるよ
私はそれを共有するために、出力ファイルにURIを取得しようとこだわっています。私は最初のウリにファイルを変換してファイルにアクセスしようとした
File outFile = context.getFileStreamPath(fileName);
return Uri.fromFile(outFile);
これはファイルを返します。///data/data/com.my.package/files/myfile.xmlを私がすることはできませんこれを電子メールに添付してアップロードするなど。
ファイルの長さを手動でチェックすると適切であり、妥当なファイルサイズがあることを示します。
次はコンテンツプロバイダを作成し、そのファイルを参照しようとしましたが、ファイルの有効なハンドルではありません。 ContentProvider
はこれまでどおりとは言えません。
Uri uri = Uri.parse("content://" + CachedFileProvider.AUTHORITY + "/" + fileName);
return uri;
これはコンテンツを返します。//com.my.package.provider/myfile.xmlを、私は、ファイルをチェックし、それがゼロの長さです。
ファイルに正しくアクセスするにはどうすればよいですか?コンテンツプロバイダでファイルを作成する必要はありますか?もしそうなら、どうですか?ここで
更新
は私が共有するために使用しているコードです。 Gmailを選択すると添付ファイルとして表示されますが、送信するとエラーが発生します添付ファイルを表示できませんでした。到着したメールには添付ファイルがありません。
public void onClick(View view) {
Log.d(TAG, "onClick " + view.getId());
switch (view.getId()) {
case R.id.share_cancel:
setResult(RESULT_CANCELED, getIntent());
finish();
break;
case R.id.share_share:
MyXml xml = new MyXml();
Uri uri;
try {
uri = xml.writeXmlToFile(getApplicationContext(), "myfile.xml");
//uri is "file:///data/data/com.my.package/files/myfile.xml"
Log.d(TAG, "Share URI: " + uri.toString() + " path: " + uri.getPath());
File f = new File(uri.getPath());
Log.d(TAG, "File length: " + f.length());
// shows a valid file size
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.setType("text/plain");
startActivity(Intent.createChooser(shareIntent, "Share"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
break;
}
}
私はcreateChooser(...)内側からここで投げException
があることに気づいたが、それがスローされますなぜ私は把握することはできません。
E/ActivityThread(572):アクティビティ com.android.internal.app.ChooserActivityは もともとここに登録されましたIntentReceiver [email protected]が漏れました。あなたは のunregisterReceiver()への呼び出しを逃していますか?
私はこのエラーを調査しており、何も明らかではありません。これらのリンクの両方は、私が受信機の登録を解除する必要があることを示唆しています。
- ChooserActivity has leaked IntentReceiver
- Why does Intent.createChooser() need a BroadcastReceiver and how to implement?
Iは、受信を設定しているが、それは別の場所に設定され、/登録解除を登録するにはアプリを必要としないAlarmManager
のためです。
openFile(...)
私が作成したコンテンツプロバイダが必要な場合は、こちらをご覧ください。
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
String fileLocation = getContext().getCacheDir() + "/" + uri.getLastPathSegment();
ParcelFileDescriptor pfd = ParcelFileDescriptor.open(new File(fileLocation), ParcelFileDescriptor.MODE_READ_ONLY);
return pfd;
}
私はcontentProviderを作成するのではなく、最初のメソッドがうまくいくと思います。 ContentProviderは、ファイル全体ではなくデータを返すために使用されます。私の推測では、あなたのXMLを処理するアプリケーションはありません。あなたの共有の意図が作成されているコードを投稿することができます – nandeesh
それがより明白になる場合のためにコードの多くが追加され、例外として私はそれが関連しているかどうかわかりません。 – Kirk
ContentProviderを作成しましたか?もしあなたが持っていれば、あなたのコードを投稿できますか?必要がない場合は、ContentProviderを作成してopenFileメソッドをオーバーライドする必要があります。このメソッドは、content://com.my.package.provider/myfile.xml uriに関連付けられたファイルを開こうとすると、gmailによって呼び出されます。 – Rob