Daten lesen von neuem Smartphone

  • Antworten:12
Wicki11
  • Forum-Beiträge: 103

08.07.2020, 21:05:01 via Website

Hallo !
Habe ein neues Android-Smartphone "Galaxy A40" ohne SD-Karte.
In meiner App brauche ich eine Map-Karte, die ich vom PC auf das Smartphone übertragen habe.
Nun brauche ich den Zugriff auf diese Karte und damit deren Speicherplatz auf dem Handy.
Im Windows10-Explorer sehe ich den PC und das per USB angekoppelte Handy
Bsp.: "Dieser PC\Galaxy A40\Phone\data". Hierhin habe ich die Map-Karte übertragen.

Mein Problem: wie gebe ich nun den "getAbsolutePath()" der Karte in meiner App an ?
Mein Versuch:

  String filename = "bike2.map";
  File filea = new File(getApplicationContext().getFilesDir(), filename);

Ich habe noch mehrere vergebliche Versuche mit dem 1. File-Parameter gemacht:
z. Bsp. "Galaxy A40/Phone/data" oder "Phone/data" oder "data"
Die Abfrage "if (filea.exists())" fällt immer negativ aus.

Im Manifest habe ich angegeben:

"android.permission.READ_USER_DICTIONARY"
"android.permission.READ_OWNER_DATA"

Bitte um Hilfe !
Wie muss ich den Pfad für das map-file formulieren ?

Gruss Wicki

Kommentieren
swa00
  • Forum-Beiträge: 3.704

08.07.2020, 21:39:16 via Website

Hallo Wicki ,

leider stimmt so Einiges nicht

a) Setze Deinen Pfad nach dem Environment
https://developer.android.com/reference/android/os/Environment
ACHTUNG : Je nach Ziel API musst du anpassen !! - Einiges ist deprecated.

b) Deine Manifest lässt kein Lesen und Schreiben zu

android.permission.WRITE_EXTERNAL_STORAGE
android.permission.READ_EXTERNAL_STORAGE

c) Und zum Schluss benötigst du die aktive Permission-Anfrage des Users.

Erst dann kannst du auch deine Datei Lesen

— geändert am 08.07.2020, 21:45:20

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Pascal P.
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

09.07.2020, 07:12:57 via Website

Hallo
Und ab Android 9, dein Handy müsste sogar 10 haben. Ist es noch etwas schwerer auf die interne oder externe sd karte zu kommen.

Für einige Ordner kommst du nur noch mit SAF ran.
Scroped storage ab Android 10.

https://www.google.com/url?sa=t&source=web&rct=j&url=https://developer.android.com/guide/topics/providers/document-provider&ved=2ahUKEwimtInGs7_qAhUCsKQKHRbADQwQFjADegQIARAB&usg=AOvVaw1jPldpdBwViwMhyT_0PJbZ

https://www.xda-developers.com/google-gives-developers-more-time-android-q-scoped-storage/

Hilfreich?
Pascal P.swa00
Kommentieren
Wicki11
  • Forum-Beiträge: 103

09.07.2020, 15:33:13 via Website

Dank für Eure Beiträge.
Das ist ja fürchterlich kompliziert geworden wenn man eine eigene Datei lesen will.
Zur Sache, das mit dem Manifest habe ich nur nicht erwähnt, die Anweisungen sind vorhanden. Inzwischen habe ich die Datei in das Verzeichnis "Documents" verlegt und folgenden Zugriff probiert:

   File stf = new File(Environment.DIRECTORY_DOCUMENTS,sz); //sz ist der dateiname bike2.map
    String stfp = stf.getAbsolutePath(); //  /Documents/bike2.map
     File ff = new File(Environment.DIRECTORY_DOCUMENTS);
    String[] ffarr=ff.list(); //null
   try {
      if (stf.exists())
        stfp += ",";
    } catch (Exception e) {
      Toast.makeText(getApplicationContext(), e.getMessage() + sz, Toast.LENGTH_LONG).show();
    }
    String[] stfarr=stf.list(); //null

Also der gleiche Misserfolg.

Das Handy zeigt unter "Eigene Dateien" an:
Aktuelle Dateien
bike2.map

— geändert am 09.07.2020, 15:42:32

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

09.07.2020, 16:15:08 via Website

a) Was sagt denn den ErrorLog - Poste den mal bitte hier.
b) Hast du auch die Permission requested ?

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

09.07.2020, 18:10:24 via Website

Hallo ja richtig poste mal das error log.

Aber mal ganz neben bei mit
File(Environment.DIRECTORY_DOCUMENTS); kommst du nicht an den path.

An den allgemeinen Ordner Dokumente. Wirst du ohne SAF nicht ran kommen.
An den Android/.... dein Paket Name.... Schon.

— geändert am 09.07.2020, 18:51:10

Hilfreich?
swa00
Kommentieren
Wicki11
  • Forum-Beiträge: 103

09.07.2020, 18:42:50 via Website

Das ist es ja, ich weiss nicht wie ich an den Pfad komme und ich probiere eben.
Ein error ist nicht aufgetreten.
Was meint Ihr mit "Permission requested " ?
Was sollte eigentlich bedeuten

aktive Permission-Anfrage des Users

Ich gebe mal die Manifestdaten an.

Manifest:

   <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.READ_USER_DICTIONARY"></uses-permission>
    <uses-permission android:name="android.permission.READ_OWNER_DATA"></uses-permission>
Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

09.07.2020, 18:51:36 via Website

Manifest alleine reicht meist nicht mehr aus (außer bei Internet etc.)
Aber du musst in deiner Activity zur Laufzeit die Permissions anfordern, kennst du doch sicher, wenn du eine App öffnest und es kommt der Dialog "App möchte zugriff auf Fotos/Mediendateien".

https://developer.android.com/training/permissions/requesting

Das musst du so machen (aus dem Link kopiert):

if (ContextCompat.checkSelfPermission(
        CONTEXT, Manifest.permission.REQUESTED_PERMISSION) ==
        PackageManager.PERMISSION_GRANTED) {
    // You can use the API that requires the permission.
    performAction(...);
} else if (shouldShowRequestPermissionRationale(...)) {
    // In an educational UI, explain to the user why your app requires this
    // permission for a specific feature to behave as expected. In this UI,
    // include a "cancel" or "no thanks" button that allows the user to
    // continue using your app without granting the permission.
    showInContextUI(...);
} else {
    // You can directly ask for the permission.
    // The registered ActivityResultCallback gets the result of this request.
    requestPermissionLauncher.launch(
            Manifest.permission.REQUESTED_PERMISSION);
}

ier ist ein gesamtbeispiel zum Dateilesen mit Permissions (leider etwas unübersichtlich):
https://www.tutorialspoint.com/how-to-read-a-txt-file-in-external-storage-with-runtime-permission-in-android

— geändert am 09.07.2020, 18:53:16

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
swa00Jokel
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

09.07.2020, 18:57:18 via Website

Hallo hier ein Beispiel für den path zu dem Dokuments Ordner im Speicherbereich deine App. Dafür brauchst du auch keine Permission das ist sozusagen der erweiterte app Speicherbereich.

String extPath= Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getAbsolutePath();

Hilfreich?
swa00
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

09.07.2020, 19:15:21 via Website

@pascal ob der link den du gegeben hast unter api 29 geht mag ich zu bezweifeln.

getExternalStorageDirectory ist ab 29
deprecated

In dem link soll auf die volle sdkarte zugegriffen werden was wie ich schon sagte ab api 29 ohne SAF nicht mehr geht.

Hilfreich?
swa00
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

09.07.2020, 19:23:27 via App

Ja kann sein das habe ich nicht überprüft...

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Wicki11
  • Forum-Beiträge: 103

11.07.2020, 21:08:22 via Website

Folgende Änderungen führten zum Erfolg:

o dateiname im Verzeicnis Documents
File stf = new File(Environment.getExternalStoragePublicDirectory(DIRECTORY_DOCUMENTS),dateiname);
Das Handy hat keine SD-Karte, aber offenbar wird hier auch der Teil des internen
Speichers einbezogen (wie Jokel schon schrieb).

o in onCreate(), Permissions anfordern
requestPermissions(new String[] {"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE","android.permission.ACCESS_FINE_LOCATION",
"android.permission.ACCESS_COARSE_LOCATION"}, 4711);
}

Noch ein Problem. Bei einem Versuch setzte der GPS-Empfang teilweise aus.
Daraufhin habe ich im Abstand von jeweils 4 Locations jedesmal einen short Toast
ausgegeben, so dass der Display immer aktiv war. Danach wurde alles aufgezeichnet.

Nochmals vielen Dank für die Beiträge.

Gruß Wicki

Hilfreich?
Kommentieren