Erstellen und Freigeben einer Datei aus dem internen Speicher

Mein Ziel ist es, eine XML-Datei zu erstelleninterne Speicher und senden Sie es dann über die Freigabe Intent.

Mit diesem Code kann ich eine XML-Datei erstellen

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

Ich versuche nicht, einen Uri in die Ausgabedatei zu laden, um ihn weiterzugeben. Ich habe zuerst versucht, auf die Datei zuzugreifen, indem ich die Datei in einen Uri konvertiert habe

File outFile = context.getFileStreamPath(fileName);
return Uri.fromFile(outFile);

Dies kehrt zurückfile: ///data/data/com.my.package/files/myfile.xml Ich kann dies jedoch scheinbar nicht an eine E-Mail, einen Upload usw. anhängen.

Wenn ich die Dateigröße manuell überprüfe, ist sie korrekt und zeigt an, dass eine angemessene Dateigröße vorliegt.

Als Nächstes habe ich einen Inhaltsanbieter erstellt und versucht, auf die Datei zu verweisen, und sie ist kein gültiges Handle für die Datei. DasContentProvider scheint nie ein Punkt genannt zu werden.

Uri uri = Uri.parse("content://" + CachedFileProvider.AUTHORITY + "/" + fileName);
return uri;

Dies kehrt zurückInhalt: //com.my.package.provider/myfile.xml aber ich überprüfe die datei und es ist null länge.

Wie greife ich richtig auf Dateien zu? Muss ich die Datei mit dem Inhaltsanbieter erstellen? Wenn das so ist, wie?

Aktualisieren

Hier ist der Code, den ich zum Teilen verwende. Wenn ich Google Mail auswähle, wird es als Anhang angezeigt, aber wenn ich es sende, wird ein Fehler angezeigtAnhang konnte nicht angezeigt werden und die E-Mail, die ankommt, hat keinen Anhang.

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

Mir ist aufgefallen, dass es eine gibtException hier von innen geworfencreateChooser (...), aber ich kann nicht herausfinden, warum es geworfen wird.

E / ActivityThread (572): Die ursprünglich hier registrierte Aktivität com.android.internal.app.ChooserActivity hat IntentReceiver com.android.internal.app.ResolverActivity$1@4148d658 durchgesickert. Vermissen Sie einen Aufruf von unregisterReceiver ()?

Ich habe diesen Fehler untersucht und kann nichts Offensichtliches finden. Beide Links deuten darauf hin, dass ich die Registrierung eines Empfängers aufheben muss.

ChooserActivity hat IntentReceiver durchgesickertWarum benötigt Intent.createChooser () einen BroadcastReceiver und wie implementiert man ihn?

Ich habe einen Empfänger eingerichtet, aber es ist für eineAlarmManager Dies ist an einer anderen Stelle festgelegt und erfordert nicht, dass die App registriert / die Registrierung aufhebt.

Code für openFile (...)

Für den Fall, dass es benötigt wird, ist hier der Inhaltsanbieter, den ich erstellt habe.

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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage