2016-05-11 7 views
0

Ich versuche ein Video mit der Absicht MediaStore.ACTION_VIDEO_CAPTURE Absicht aufzunehmen.Kann ich ein Video ohne zusätzliche Berechtigungen aufnehmen?

Dies startet die Kamera-Aktivität und ich kann ein Video aufnehmen. Das Problem ist, dass ich die Berechtigungen nicht über die zurück file:// uri zu lesen:

protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    String uriStr = intent.getData().toString(); 
    /** 
    * uriString contains file:/storage/emulated/0/DCIM/Camera/VID_20160511_142405.mp4 
    */ 
    try { 
     getContentResolver().openInputStream(intent.getData()).close(); 
    } catch (IOException e) { 
    } 
} 

ich die Kamera-Anwendung mir temporäre Berechtigungen erteilen würde erwarten, wie in http://developer.android.com/guide/topics/providers/content-provider-basics.html#Intents beschrieben. Aber es funktioniert nicht mit einem Berechtigungsfehler:

java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/VID_20160511_142806.mp4: open failed: EACCES (Permission denied) 

Gibt es eine Möglichkeit das Video ohne die READ_EXTERNAL_STORAGE Erlaubnis zu bekommen?

+0

Eigentlich möchten Sie stattdessen 'WRITE_EXTERNAL_STORAGE'. Es beinhaltet implizit 'READ_EXTERNAL_STORAGE'. –

+0

Eigentlich wird nur 'READ_EXTERNAL_STORAGE' von meiner App benötigt. Die Kamera-App benötigt 'WRITE_EXTERNAL_STORAGE', hat es aber schon. – mbonnin

+0

'Kann ich ein Video aufnehmen? Sie möchten es ** also speichern **. Daher brauchen Sie eigentlich 'WRITE_EXTERNAL_STORAGE'. –

Antwort

2

I would expect the Camera application to grant me temporary permissions

Das ist nicht möglich, mit einem file:Uri ist. Das ist nur mit einem content:Uri möglich.

Is there a way to not request the video without the READ_EXTERNAL_STORAGE permission ?

Fügen Sie Ihrer App eine FileProvider hinzu. Dann verwenden Sie EXTRA_OUTPUT auf Ihrem ACTION_VIDEO_CAPTUREIntent, einen content:Uri von Ihrem FileProvider liefern. Enthalten Sie die entsprechenden Flags auf dem Intent, um Schreibzugriff auf jede App zu gewähren, die Ihre ACTION_VIDEO_CAPTUREIntent verarbeitet. Dann — vorausgesetzt, die Kamera-App wurde gut geschrieben — das Video wird in eine Datei auf Ihrer App internen Speicher geschrieben (oder wo immer Sie konfigurieren FileProvider zu bedienen), und Sie brauchen nicht READ_EXTERNAL_STORAGE.

Beachten Sie jedoch, dass Sie die Berechtigung CAMERA mindestens auf Android 6.0+ benötigen, wenn Ihr targetSdkVersion 23+ ist.

+0

Das sah sehr vielversprechend aus, aber ich kann es nicht mit meinem Nexus5X + Marshmallow schaffen. Ich übergebe 'content: // com.company.video/uploads/1463007061740' in' EXTRA_OUTPUT' und bekomme 'CAM_StateReviewVid: java.io.FileNotFoundException: Kann nicht auf/uploads/1463007061740' von der Kamera-App mit der Vorschau zugreifen schwarz. Ich denke, ich bleibe nur bei den externen Speicherberechtigungen für jetzt ... Danke trotzdem für die Hilfe. – mbonnin

+0

@mbonnin: Das muss bald behoben werden. ['file:' 'Uri' Werte hören auf, auf Android N zu arbeiten] (https://commonsware.com/blog/2016/03/14/psa-file-scheme-ban-n-developer-preview.html), einmal Sie haben 'targetSdkVersion' hoch genug gesetzt. – CommonsWare

+0

Verdammt! Danke für die Details. Davon abgesehen bin ich nicht derjenige, der 'file:' uri erstellt, die Google Kamera-App ist. Ich wäre sehr glücklich, einen 'Inhalt:' uri mit temporären Berechtigungen zu erhalten, außer dass dies nicht das ist, was jetzt passiert ... – mbonnin