2017-04-15 4 views
0

Bevor ich beginne, meine Frage zu erklären, muss ich erwähnen, dass ich neu in Android-Entwicklung bin.Zugriff auf externen Speicher verweigert in AndroidTest

Ich versuche, ein Programm für Android zu schreiben, das OpenCV Java API für einige Datenverarbeitung verwendet. Ich entwickle Komponententests für Klassen, die Algorithmen implementieren, und diese Klassen sind noch mit keiner Aktivität verbunden. Mit anderen Worten, ich möchte nur die Funktionalität von Methoden testen, bevor ich mit Aktivitäten zu tun habe.

Da ich Zugriff auf OpenCV-Bibliotheken haben muss, habe ich meinen Unit-Test unter androidTest in Android Studio geschrieben. Die Dateien, die Daten enthalten und im Programm gelesen werden müssen, werden nach/sdcard/DIR und/storage/emulated/0/DIR kopiert. Ich habe AndroidManifest.xml die folgende Berechtigung hinzugefügt, um Zugriff auf externen Speicher zu gewähren.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

Allerdings, wenn ich versuche, Dateien von externen Speichern zu lesen bekomme ich open failed: EACCES (Permission denied). Beachten Sie, dass ich den von Environment.getExternalStorageDirectory().getAbsolutePath() zurückgegebenen Pfad mit dem Namen der Datendateien verkette und später den Inhalt der Dateien mit FileInputStream lese.

Ich habe ähnliche Fragen und Antworten gesehen, die erwähnen, dass der Zugriff zur Laufzeit für APIs über 23 gewährt werden sollte. Da ich jedoch keine Aktivitäten für meine Methoden habe, kann ich zur Laufzeit keine Berechtigung anfordern.

  1. Gibt es weitere Verzeichnisse, die ich verwenden kann, um meine Datendateien zu platzieren, für die diese Berechtigungen nicht erforderlich sind? Ich dachte an assets als eine Option, aber ich gehe davon aus, dass Assets in der endgültigen apk sind und wenn ich Dateien für eine andere Daten ändern muss, muss ich jedes Mal eine neue apk erstellen.

  2. Wie sollte ich den Zugriff auf/sdcard gewähren, ohne irgendwelche Aktivitäten zu haben, die den Benutzer zur Laufzeit um Erlaubnis fragen?

  3. Kann ich lokale Tests anstelle von androidTest durchführen, indem ich OpenCV-Bibliotheken auf meiner Linux-Maschine installiere?

Antwort

0

ich eine vorübergehende Lösung für dieses Problem gefunden. Ich habe in MainActivity eine Schaltfläche entworfen, die Benutzer auffordert, auf das Verzeichnis zuzugreifen, in dem sich meine Dateien befinden. Danach konnte ich die androidTest-Unit-Tests ausführen, ohne die Ausnahme zu beachten, da diese Berechtigung nur einmal erteilt werden muss.

0

Sorry, aber android nicht vor, dass Art des Zugriffs Sie müssen eine Aktivität erstellen, um die Anwendung starten

Ich denke, wenn Sie Eibisch-Gerät verwenden, dann werden Sie benötigen die fragen Erlaubnis und schreiben externe Speicher zur Laufzeit

Sie können unter der folgenden Liink https://developer.android.com/training/permissions/requesting.html

0
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)== 
    PackageManager.PERMISSION_GRANTED) { 
    //do the things} else { 
    requestPermissions(new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 
     AnyNumber); 
siehe lesen

fangen später diese Anfragen in

@Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     if (requestCode == AnyNumber) { 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED 
        && grantResults[1] == PackageManager.PERMISSION_GRANTED) { 
      } 
     } 
    } 
+0

Wie könnte die Erlaubnis gewährt werden, ohne eine UI zu haben? Anforderungen nicht erforderlichPermissions erfordern eine Benutzeroberfläche? – Mahdi

+0

Es war möglich für frühere Versionen von Android, aber nach Marshmallow-Berechtigungen wird dynamisch und nicht während der Installation gefragt –

Verwandte Themen