Android Zugriff auf eine Datei, diese von einer anderen App erstellt wurde?

jackie05

Mitglied
Hallo zusammen.
Ich versuche schon seit Wochen das Problem zu lösen, leider ohne Erfolg.

Ich habe 2 Apps und ich möchte von der erste App ein Backup "von der SQLite Datenbank" erstellen und in der 2te App wieder Importieren.
Das mit dem erstellen und importieren ist kein Problem, nur kann ich mit der 2te App nicht auf die Datei zugreifen, diese ich mit der 1te App erstellt habe.

Früher hat es Problemlos funktioniert, aber seit Android 11 nicht mehr.
Ab November 2021 müssen alle Updates auf "targetSdkVersion" 30 eingestellt sein und jetzt muss ich mir natürlich überlegen, wie ich meine Apps weiterhin in Google Play behalten kann.
Ich möchte auch keine volle Rechte geben, da meine App sonst im Google Play abgelehnt wird.
Meine App braucht die Rechte um einen Backup zu erstellen und in der 2te App diese wieder zu Importieren.
Ich habe 2 Apps, da die erste App mit Werbung ist und die 2te App (Pro Version) ohne Werbung.

Hiermit erstelle ich einen Backup von der SQLite Datenbankdatei:
Code:
ContentResolver resolver = getApplicationContext().getContentResolver();
Uri file = Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),"Database_Backup.db"));
try (ParcelFileDescriptor pfd = resolver.openFileDescriptor(file, "rw")) {
    try {
        InputStream in = new FileInputStream(getDatabasePath(DBHelper.DATABASE_NAME));
        OutputStream out = new FileOutputStream(pfd.getFileDescriptor());
        byte[] buffer = new byte[1024];
        int read;
        while ((read = in.read(buffer)) != -1) {
            out.write(buffer, 0, read);
        }
        in.close();
        out.flush();
        out.close();
    }
    catch (FileNotFoundException e) {
        Log.e("tag", e.getMessage());
    }
    catch (Exception e) {
        Log.e("tag", e.getMessage());
    }
} catch (IOException e) {
    e.printStackTrace();
}

Hiermit Importiere ich die Datei wieder:
Code:
try (ParcelFileDescriptor pfd = ParcelFileDescriptor.open(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),"Database_Backup.db"), ParcelFileDescriptor.MODE_READ_WRITE);) {
    try {
        File fileTo = new File(getDatabasePath(DBHelper.DATABASE_NAME).getParent(), DBHelper.DATABASE_NAME);
        FileChannel src = new FileInputStream(pfd.getFileDescriptor()).getChannel();
        FileChannel dst = new FileOutputStream(fileTo).getChannel();
        dst.transferFrom(src, 0, src.size());
        src.close();
        dst.close();
    } catch (Exception e) {
        Log.d(TAG, "Import Failed!");
    }
} catch (IOException e) {
    e.printStackTrace();
}

Code:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" tools:ignore="ScopedStorage"/>

<application
    .......
    android:requestLegacyExternalStorage="true"
    .........

Ich würde mich sehr freuen, wenn mir da wer helfen kann und bedanke mich schon mal im Voraus.

Gruss
 
Zuletzt bearbeitet:

Jw456

Top Contributor
Hallo
Ist die Datei auch wirklich in dem App Ordner angekommen?
Hat sie auch die richtigen System Datei rechte (chmode)?

Geht es in der gleichen App die Datei zu exportieren und wieder einzulesen und dann zu öffnen?
 
Zuletzt bearbeitet:

Jw456

Top Contributor
Tipp hast du es mal versucht in der App mit Werbung die Datei auf Datei Systemebne ohne den ContentResolver zu exportieren.
Dann in der App ohne Werbung wider zu importieren .

Dazu solltest du einen Export und Import in der App anbieten.

Ps beim export und import muss die DB geschlossen sein.
 

jackie05

Mitglied
Vielen Dank für die Antworten.
Hallo
Ist die Datei auch wirklich in dem App Ordner angekommen?
Hat sie auch die richtigen System Datei rechte (chmode)?

Geht es in der gleichen App die Datei zu exportieren und wieder einzulesen und dann zu öffnen?
In der gleiche App kann ich es wieder Importieren, nur nicht mit der anderen App.
Wenn ich mit der anderen App die Datei exportiere, dann kann ich mit diese dann auch wieder importieren.
Ich kann nur nicht auf die Datei zugreifen, wenn diese von der anderen App erstellt wurde, mit der gleiche App klappt das.

Wenn ich diese Berechtigung hinzufüge:
Code:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" />
Code:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    if (Environment.isExternalStorageManager()) {
        localBackupSave();
    } else {
        Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
        Uri uri = Uri.fromParts("package", getPackageName(), null);
        intent.setData(uri);
        startActivity(intent);
    }
}
und den Zugriff auf alle Dateien erlaube, dann klappt ja alles wieder, nur wird mein Update auf Google Play dann abgelehnt, nach einer kurzen Überprüfung von Google.

Tipp hast du es mal versucht in der App mit Werbung die Datei auf Datei Systemebne ohne den ContentResolver zu exportieren.
Dann in der App ohne Werbung wider zu importieren .

Dazu solltest du einen Export und Import in der App anbieten.

Ps beim export und import muss die DB geschlossen sein.
Ich habe es auch ohne ContentResolver versucht, leider klappt das nicht.
Die Datenbank ist geschlossen und wird nur verbunden, wenn ich eine Abfrage mache um etwas auszulesen.

Im Anhang befindet sich ein Bild von Google, warum die App abgelehnt wurde.

Ich brauche die Rechte auf alle Dateien, damit ich mit der anderen App auch auf diese Datei zugreifen kann.

Laut Google:
Code:
Aufgrund der momentanen Situation können Apps für Android 11 (API-Level 30), die Zugriff auf alle Dateien anfordern, erst wieder im Mai 2021 bei Google Play hochgeladen werden. Das gilt sowohl für neue Apps als auch für Updates bestehender Apps. Diese temporäre Upload-Einschränkung betrifft nur Apps, die sowohl für Android 11 (API-Level 30) bestimmt sind als auch die Berechtigung "Zugriff auf alle Dateien" erfordern.
Deswegen verstehe ich nicht, wieso meine App mit dieser Berechtigung abgelehnt wurde oder ich muss einfach mal eine richtige erklärung abgeben, warum ich diese Berechtigung brauche.

Oder hat jemand eine Idee, wie ich das Problem noch lösen könnte?

Mal was andere:
In meiner App hat man auch die Möglichkeit sein Backup direkt auf Google Drive zu sichern unter den Einstellungen "verborgene Dateien", das klappt auch Wunderbar, nur wäre es Super, wenn ich mit der 2te App auch darauf zugreifen könnte, dann hätte sich das mit dem Backup auf den Telefonspeicher erledigt.
Würde das denn gehen?
Also, das ich mit 2 verschiedene App eine einzige Google Drive Backup habe und mit den 2 Apps ohne Probleme darauf zugreifen könnte?

Gruss
 

Anhänge

  • Google.png
    Google.png
    120,4 KB · Aufrufe: 3

Jw456

Top Contributor
Welche Fehlermeldung kommt den eigentlich nach dem Import der DB Datei.
Bei einen Zugriff oder beim öffnen der DB?

Mall von dem Kopieren abgesehen kannst du eigentlich die DB auch auf ineinem externen Verzeichnis öffnen? Früher ging das.

Auch das erstellen eine DB auf einem anderen Speicherbereich ging.


Zugreifen auf externen Speicher geht seit API 30 nur noch mit SAF (Storage Access Framework)

Edit
Bis API 29 war nur die echte Physikalische SD Karte davon betroffen jetzt auch die Internen SD Karte.
Mit SAF musst du dir ja die Erlaubnis vom User holen.
 
Zuletzt bearbeitet:

jackie05

Mitglied
Welche Fehlermeldung kommt den eigentlich nach dem Import der DB Datei.
Bei einen Zugriff oder beim öffnen der DB?
Beim Importieren von der 2ten App erhalte ich folgende Fehlermeldung:
Code:
open failed: EACCES (Permission denied)
Wenn ich mit der App Importiere, mit diese ich die Backupdatei erstellt habe, da klappt es ohne Probleme.

Hab keine wirkliche Ahnung von Android, aber das klingt zumindest nicht ganz falsch: https://developer.android.com/training/secure-file-sharing
Das habe ich auch schon versucht und es funktioniert einfach nicht.
Es soll ja möglich sein, auf Dateien zuzugreifen, diese mit einer anderen App erstellt wurde mit FileProvider, nur klappt es bei mir irgendwie nicht.

Versuche es doch mal mit Firebase. Du kannst ja da verschiedene Paketnamen für eine DB angeben.
In meiner App ist Firebase integriert um Push-Nachrichten zu senden.
Ich habe mich da noch nicht so beschäftigt, ob ich auch Backups von der App auf Firebase sichern kann.

Gruss
 

jackie05

Mitglied
Ich hab das mit dem Backup auf Google Drive jetzt hinbekommen.
Dazu habe ich einfach einen 2ten "OAuth 2.0-Client-IDs"erstellt für mein Projekt, nun kann ich mit meine 2 Apps auf das hochgeladene Backup zugreifen und herunterladen.
Also hat sich das erst einmal erledigt, mit dem Backup auf den Telefonspeicher.
Vielleicht füge ich das irgendwann mal hinzu.

Und vielen Dank für die Hilfe.

Gruss
 

Jw456

Top Contributor
open failed: EACCES (Permission denied)
Diesen Fehler müsstest du eigentlich schon beim exportieren der Datei bekommen haben. Du wirst da auch in dem chatch Block gekommen sein.
Mit den üblichen pemission.
Denn ohne die Zustimmung des users kommst du nicht auf denn öffentlichen Download Ordner.
 

jackie05

Mitglied
Diesen Fehler müsstest du eigentlich schon beim exportieren der Datei bekommen haben. Du wirst da auch in dem chatch Block gekommen sein.
Mit den üblichen pemission.
Denn ohne die Zustimmung des users kommst du nicht auf denn öffentlichen Download Ordner.
Ja, das passiert ja auch beim importieren der Datei.
Ich sagte ja, das ich keinen Zugriff auf die Datei habe.

Aber das hat sich jetzt vorerst erledigt, da ich die Backups über Google Drive sichere.

Gruss
 

Jw456

Top Contributor
Ich hatte erst so verstanden das du es exportieren aber nicht wider lesen kannst.

Wie Ich schon sagte ist es ab API 30 nicht mehr möglich auf die öffentlichen Speicherbereiche der internen oder externen SD Karte zuzugreifen.

dies geht nur noch mit SAF dazu brauchst du die Premission im manifest nicht mehr.
Unter API 29 ist es noch möglich nach abfrage der SAF Premission vom User zugriff zur gesamtem Sd Karte zu bekommen.
Unter API 30 ist auch das vorbei es wird eine Liste der öffentlichen Verzeichnisse angezeigt und du musst da sogar einen neuen Ordner anlegen auf den du dann zugriff hast.

hier ein einfaches Beispiel mit SAF

Java:
  public class MainActivity extends AppCompatActivity {

        DocumentFile treeUrlDir;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            getSAF_Prermissions();

        }

        void getSAF_Prermissions() {
            SharedPreferences TreePref = getSharedPreferences("SAF_Premission", 0);
            String st = TreePref.getString("TreeURL", "");
            if (!st.equals("")) {
                treeUrlDir = DocumentFile.fromTreeUri(this, Uri.parse(st));
                premissionOK();
            } else {
                startActivityForResult(new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE), 42);
            }
        }

        void premissionOK() {

            DocumentFile dir1 = treeUrlDir.createDirectory("Hallo");
            DocumentFile dir2 = dir1.createFile("txt", "Hallo.txt");

            try {
                writeTextToUri(dir2.getUri());
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                String text = readTextFromUri(dir2.getUri());
                Log.d("Saf-Test",text);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        private String readTextFromUri(Uri uri) throws IOException {
            InputStream inputStream = getContentResolver().openInputStream(uri);
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder stringBuilder = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                stringBuilder.append(line);
            }
            reader.close();
            return stringBuilder.toString();
        }

        private void writeTextToUri(Uri uri) throws IOException {
            OutputStream outPutStream = getContentResolver().openOutputStream(uri);
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outPutStream));
            StringBuilder stringBuilder = new StringBuilder();
            String line;
            writer.write("Hallo das ist ein Text");
            writer.close();
        }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if ((requestCode == 42) && (resultCode == RESULT_OK) && (data != null)) {
                treeUrlDir = DocumentFile.fromTreeUri(this, data.getData());
                SharedPreferences TreePref = getSharedPreferences("SAF_Premission", 0);
                SharedPreferences.Editor TreeEd = TreePref.edit();
                TreeEd.putString("TreeURL", treeUrlDir.getUri().toString());
                TreeEd.commit();
                premissionOK();
            }
        }
    }

Java:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jw.sdcard_saf_api23_extern">

    <application
        android:requestLegacyExternalStorage="true"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name="com.jw.sdcard_saf_api23_extern234.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W onViewCreated blockiert Session Zugriff gegensatz zu onCreateView? Fragment Android & Cross-Platform Mobile Apps 25
R Android Zugriff auf view von MainActivity Android & Cross-Platform Mobile Apps 7
M Zugriff auf Helligkeitsregler von Handy? Android & Cross-Platform Mobile Apps 17
C Zugriff auf die Position eines String- bzw Spinner-Arrays Android & Cross-Platform Mobile Apps 1
E Wie erhalte ich Zugriff auf das Microfon? (Android Studio) Android & Cross-Platform Mobile Apps 9
B Android Kein Zugriff auf Telefonspeicher (Android 6) Android & Cross-Platform Mobile Apps 1
N Zugriff auf TextView in ListItem via ButtonClick Android & Cross-Platform Mobile Apps 4
K Android Zugriff auf FTP-Server Android & Cross-Platform Mobile Apps 1
S Android Zugriff auf Bilder im Telefonspeicher + Galeriedarstellung Android & Cross-Platform Mobile Apps 5
N Android Zugriff auf PlayStore im Abgesicherten Modus verhindern Android & Cross-Platform Mobile Apps 2
L Zugriff auf entfernten mySQL-Server via Android Android & Cross-Platform Mobile Apps 4
T Android Reflection zugriff auf setFocusableInTouchMode Android & Cross-Platform Mobile Apps 5
L Android Zugriff aus unbound Service auf Preferences Android & Cross-Platform Mobile Apps 2
H Smartphone (Front-)Kamera-Zugriff per Website Android & Cross-Platform Mobile Apps 6
S Android Zugriff auf FTP Server Android & Cross-Platform Mobile Apps 7
S Android Zugriff auf Website fuers Infos Android & Cross-Platform Mobile Apps 2
C Java ME Kein Java Zugriff auf Samsung! Android & Cross-Platform Mobile Apps 5
R Java ME mit Zugriff auf Adressbuch / Kalender Android & Cross-Platform Mobile Apps 3
H FileConnection: Frage nach Dateisystem-Zugriff unterdrücken Android & Cross-Platform Mobile Apps 5
1 zugriff auf handy-microfon Android & Cross-Platform Mobile Apps 2
H Zugriff auf XML/DB oder aehnliches Android & Cross-Platform Mobile Apps 3
G Zugriff auf den gesamten Bildschirm bei PDAs Android & Cross-Platform Mobile Apps 8
L Android Wie erstelle ich eine dynamische Tabelle (TableLayout)? Android & Cross-Platform Mobile Apps 2
W Zur Laufzeit erstelltes MenuItem an eine View binden Android & Cross-Platform Mobile Apps 1
W Pixel Farbe in eine andere Farbe ändern im ImageView von ein Icon Android & Cross-Platform Mobile Apps 14
S Sinnvollste weg eine SQLite DB mit Android auslesen Android & Cross-Platform Mobile Apps 7
L Regelmäßig eine Methode im Hintergund ausführen Android & Cross-Platform Mobile Apps 1
J Android Wann ist eine App privat? Android & Cross-Platform Mobile Apps 10
M Android Schreiben von JsonDaten in eine SqliteDB Android & Cross-Platform Mobile Apps 7
M Suche eine Webseite mit dem aktuelle Datum in XML Android & Cross-Platform Mobile Apps 18
R Android Eine Website-frame in einer App Android & Cross-Platform Mobile Apps 4
Robat Android Wie mache ich eine App mit verschiedenen Leveln? Android & Cross-Platform Mobile Apps 8
M [Android] Wie erstellt man eine Verknüpfung eines Ordners? Android & Cross-Platform Mobile Apps 7
R [ANDROID] Dynamisch eine Liste erweitern Android & Cross-Platform Mobile Apps 3
K Verständisfrage bzgl. Buttons und ihnen eine Funktion geben. Android & Cross-Platform Mobile Apps 3
X Android Wo gibts eine SortableListView? Android & Cross-Platform Mobile Apps 6
G eine Methode einer anderen Activity aufrufen Android & Cross-Platform Mobile Apps 9
S Android In Service überprüfen ob eine Activity gebunden ist? Android & Cross-Platform Mobile Apps 6
B TableLayout verhält sich nicht wie eine Tabelle Android & Cross-Platform Mobile Apps 3
L Android Eine Kleinigkeit für Profis Android & Cross-Platform Mobile Apps 2
A Android Eine Datei in Android löschen, aber wie ? Android & Cross-Platform Mobile Apps 24
A Koordinaten eine Images feststellen Android & Cross-Platform Mobile Apps 9
U [Android] Eine Datei aus Jar-Archiv laden Android & Cross-Platform Mobile Apps 4
N Gibt es eine opensource Speech-to-Text engine? Android & Cross-Platform Mobile Apps 3
B Android Eine Warnung in der Console (Eclipse) auswerten Android & Cross-Platform Mobile Apps 3
T Android Ergebnis eines XML+XSLT "transform" in eine HTML - Datei schreiben (Android) Android & Cross-Platform Mobile Apps 2
M Eclipse: cdc.jar in eine Midlet Suite integrieren Android & Cross-Platform Mobile Apps 18
L SecurityException beim lesen/schreiben eine Datei Android & Cross-Platform Mobile Apps 7
H Gibt es eine Alternative zur Location API? Android & Cross-Platform Mobile Apps 4
F Wie komplex wäre eine Wecker-Applikation? Android & Cross-Platform Mobile Apps 5
I Foto mit einer bestimmten Auflösung aufnehmen und als Datei ablegen. Android & Cross-Platform Mobile Apps 5
I Android CameraApp, eingebaute App nutzen und Ergebniss als Datei speichern Android & Cross-Platform Mobile Apps 0
R Android Audio-Datei fliessend vorspulen Android & Cross-Platform Mobile Apps 9
T Screenshot speichern ohne alte Datei überschreiben Android & Cross-Platform Mobile Apps 3
R Audio-Datei abspielen Android & Cross-Platform Mobile Apps 3
L Android content URI Datei einlesen Android & Cross-Platform Mobile Apps 9
S Android Datei aus dem Netz einlesen Android & Cross-Platform Mobile Apps 6
V Android Wird mein Vorhaben funktionieren? (Apk Datei decompilieren, bearbeiten, compilieren) Android & Cross-Platform Mobile Apps 2
L Android Datei Übertragung im Netzwerk Android & Cross-Platform Mobile Apps 8
S Termin aus *.txt Datei in Google Kalender eintragen? Android & Cross-Platform Mobile Apps 1
S *.APK Datei automatisch installieren? Android & Cross-Platform Mobile Apps 4
JavaWolf165 Android Fehler beim Speichern/Downloaden einer Datei Android & Cross-Platform Mobile Apps 2
B Android XML Datei editieren --> Permission denied Android & Cross-Platform Mobile Apps 2
M Android Speichern einer .txt Datei im InternalStorage Android & Cross-Platform Mobile Apps 2
B Android Absolute kml-Datei erzeugen Android & Cross-Platform Mobile Apps 2
B Fragen zum Speichern einer Datei auf dem Gerät? Android & Cross-Platform Mobile Apps 7
S Listview Einträge aus "xml" Datei Android & Cross-Platform Mobile Apps 1
G Datei erstellen Android & Cross-Platform Mobile Apps 10
L Android Apache POI: Datei speichern geht nicht Android & Cross-Platform Mobile Apps 1
A Android Datei erstellen/schreiben/auslesen Android & Cross-Platform Mobile Apps 1
K Android Erstellt Ordner statt Datei. Android & Cross-Platform Mobile Apps 3
M Datei verschicken per byteArray? Android & Cross-Platform Mobile Apps 1
L Android Datei erstellen, Daten einspeichern und auslesen Android & Cross-Platform Mobile Apps 2
B Datei downloaden über DialogBox? Android & Cross-Platform Mobile Apps 4
G Datei im Ordner speichern Android & Cross-Platform Mobile Apps 2
G Datei erzeugen, per E-Mail senden Android & Cross-Platform Mobile Apps 5
D Android WAV-Datei abspielen / Klangfolge(Endlos) Android & Cross-Platform Mobile Apps 4
D gpx-Datei von Smartphone auf Server uploaden Android & Cross-Platform Mobile Apps 4
E Java ME Suche aufgenommene Datei Android & Cross-Platform Mobile Apps 4
K mp3 datei in j2me abspielen Android & Cross-Platform Mobile Apps 16
M Text in txt-Datei schreiben und nach ABC sortieren? Android & Cross-Platform Mobile Apps 2
R String wie WAV Datei nutzen Android & Cross-Platform Mobile Apps 4
A jad-Datei to N95 Android & Cross-Platform Mobile Apps 18
C 2 kleine Probleme (Datei lesen, String durchsuchen) Android & Cross-Platform Mobile Apps 16
G WAV datei abspielen aber wohin kopieren ? Android & Cross-Platform Mobile Apps 2
S Variable Anzahl von Bytes aus einer Datei lesen Android & Cross-Platform Mobile Apps 2

Ähnliche Java Themen

Neue Themen


Oben