BitmapFactory kann nach Fotos auf Android Nougat keine Bitmap von Uri dekodieren

8

Ich habe versucht, ein Foto zu machen und dann das Foto zu verwenden. Hier ist was ich getan habe.

Mein Gerät war Nexus 6P (Android 7.1.1) .

Zuerst habe ich ein Uri erstellt:

%Vor%

Und dann habe ich Intent :

gestartet %Vor%

Zuletzt habe ich diese Uri auf onActivityResult :

behandelt %Vor%

In der Zwischenzeit, hier sind UriUtil :

%Vor%

und getTakePicIntent(Uri) :

%Vor%

und requireSDKInt :

%Vor%

Alles funktioniert auf einer anderen Android-API als auf Android Nougat (7.x.x) . Sogar 'FileProvider' wurde bereitgestellt, 'requireBitmap' wird immer als 'null' zurückgegeben.

Nach dem Lesen der Logs wurde FileNotFoundException von BitmapFactory geworfen. Es war wie:

%Vor%

Es scheint alles klar zu sein, aber das kann ich immer noch nicht verstehen.

Wie könnte es sein? Klar habe ich ein File erstellt! Wie könnte ich das lösen? Irgendwelche Ideen?

    
SilentKnight 16.02.2017, 03:19
quelle

7 Antworten

4

Ich habe deinen Code ausprobiert. Hier ist die Probe von meinem Versuch. Ссылка .

Sehen Sie sich diesen Blog Ссылка

an

commonsware erwähnt im Blog, dass Sie new File (mPicPath.getPath()) nicht tun sollten.

Stattdessen sollten Sie das Folgende in onActivityResult

verwenden %Vor%

Und das XML

%Vor%

Hinweis: Es ist ein Inhalt uri, den Sie haben. Auf meinem Handy bekomme ich die URI wie folgt. Getestet nur auf Nexus6p.

content: //com.example.raghu.stackoverflowtest.fileProvider/external_files/Pictures/JPEG_20170424_161429691143693160.jpg

Mehr zum Dateianbieter Ссылка

    
Raghunandan 24.04.2017, 10:45
quelle
4

Probieren Sie diese Funktion aus. Das funktioniert für mich

%Vor%

Hier ist meine statische Funktion HelperFunction-Klasse, die oben verwenden.

%Vor%

}

    
Vanraj Vyas 24.04.2017 04:37
quelle
2

Es sieht so aus, als würde {@applicationID} eigentlich die Paket-ID Ihrer Anwendung enthalten. So wie es ist, existiert der Ordner nicht, so dass die Datei nicht geschrieben oder gelesen werden kann. es sieht aus wie  SPApplication.getInstance (). GetExternalFilesDir (Environment.DIRECTORY_PICTURES); gibt keinen gültigen Pfad zurück.

    
C James 18.04.2017 12:18
quelle
2

Nougat und das vorherige Update arbeiten mit diesem Code

Um den echten Pfad von der Datenbank in nougat zu erhalten, benutzen Sie diese Funktion und übergeben Sie das uri, das Sie im Datenfeld bekommen, wie in onActivityResult und holen Sie sich dann die Datei aus dem Pfad.

%Vor%     
chetan halani 22.04.2017 05:50
quelle
2

Sie sollten FileProvider verwenden. Sie können sich auf diese Übertragung für die erforderliche Änderung beziehen.

    
Fung LAM 24.04.2017 09:37
quelle
2

Probieren Glide .

1. Glide-Abhängigkeit zu app / build.gradle hinzufügen

%Vor%

2. Laden Sie das Bild mit Glide

%Vor%

ODER

%Vor%     
Pehlaj 24.04.2017 12:21
quelle
1
___ answer43579905 ___

Probieren Sie diese Funktion aus. Das funktioniert für mich

%Vor%

Hier ist meine statische Funktion HelperFunction-Klasse, die oben verwenden.

%Vor%

}

    
___ qstnhdr ___ BitmapFactory kann nach Fotos auf Android Nougat keine Bitmap von Uri dekodieren ___ answer43471944 ___

Es sieht so aus, als würde {@applicationID} eigentlich die Paket-ID Ihrer Anwendung enthalten. So wie es ist, existiert der Ordner nicht, so dass die Datei nicht geschrieben oder gelesen werden kann. es sieht aus wie  SPApplication.getInstance (). GetExternalFilesDir (Environment.DIRECTORY_PICTURES); gibt keinen gültigen Pfad zurück.

    
___ answer43586044 ___

Ich habe deinen Code ausprobiert. Hier ist die Probe von meinem Versuch. Ссылка .

Sehen Sie sich diesen Blog Ссылка

an

commonsware erwähnt im Blog, dass Sie %code% nicht tun sollten.

Stattdessen sollten Sie das Folgende in %code%

verwenden %Vor%

Und das XML

%Vor%

Hinweis: Es ist ein Inhalt uri, den Sie haben. Auf meinem Handy bekomme ich die URI wie folgt. Getestet nur auf Nexus6p.

content: //com.example.raghu.stackoverflowtest.fileProvider/external_files/Pictures/JPEG_20170424_161429691143693160.jpg

Mehr zum Dateianbieter Ссылка

    
___ qstntxt ___

Ich habe versucht, ein Foto zu machen und dann das Foto zu verwenden. Hier ist was ich getan habe.

Mein Gerät war Nexus 6P (Android 7.1.1) .

Zuerst habe ich ein %code% erstellt:

%Vor%

Und dann habe ich %code% :

gestartet %Vor%

Zuletzt habe ich diese %code% auf %code% :

behandelt %Vor%

In der Zwischenzeit, hier sind %code% :

%Vor%

und %code% :

%Vor%

und %code% :

%Vor%

Alles funktioniert auf einer anderen Android-API als auf Android Nougat (7.x.x) . Sogar 'FileProvider' wurde bereitgestellt, 'requireBitmap' wird immer als 'null' zurückgegeben.

Nach dem Lesen der Logs wurde %code% von %code% geworfen. Es war wie:

%Vor%

Es scheint alles klar zu sein, aber das kann ich immer noch nicht verstehen.

Wie könnte es sein? Klar habe ich ein %code% erstellt! Wie könnte ich das lösen? Irgendwelche Ideen?

    
___ answer43555749 ___

Nougat und das vorherige Update arbeiten mit diesem Code

Um den echten Pfad von der Datenbank in nougat zu erhalten, benutzen Sie diese Funktion und übergeben Sie das uri, das Sie im Datenfeld bekommen, wie in onActivityResult und holen Sie sich dann die Datei aus dem Pfad.

%Vor%     
___ antwort43601790 ___

Anstatt in Bitmap zu konvertieren, nehmen Sie den Screenshot Ihrer ImageView und speichern Sie ihn dann im Bmp-Format.!

    
___ answer43584631 ___

Sie sollten %code% verwenden. Sie können sich auf diese Übertragung für die erforderliche Änderung beziehen.

    
___ tag123android ___ Android ist das mobile Betriebssystem von Google, das zum Programmieren oder Entwickeln von digitalen Geräten (Smartphones, Tablets, Automobile, Fernseher, Wear, Glass, IoT) verwendet wird. Verwenden Sie für Themen rund um Android Android-spezifische Tags wie android-intent, nicht intent, android-activity, nicht activity, android-adapter, nicht adapter usw. Bei anderen Fragen als der Entwicklung oder Programmierung, aber im Zusammenhang mit Android Framework, verwenden Sie Der Link: https://android.stackexchange.com. ___ answer43587961 ___

Probieren Glide .

1. Glide-Abhängigkeit zu app / build.gradle hinzufügen

%Vor%

2. Laden Sie das Bild mit Glide

%Vor%

ODER

%Vor%     
___ tag123bitmap ___ Der allgemeinere Begriff "Pixmap" bezieht sich auf eine Karte von Pixeln, in denen jeder mehr als zwei Farben speichern kann und somit mehr als ein Bit pro Pixel verwendet. Oft wird dafür auch Bitmap verwendet. In einigen Zusammenhängen impliziert der Begriff Bitmap ein Bit pro Pixel, während Pixmap für Bilder mit mehreren Bits pro Pixel verwendet wird. ___ tag123androidcameraintent ___ Fragen zum Aufruf der Kamera-App vom lokalen Gerät ohne Kamera-Erlaubnis. ___ tag123android70nougat ___ Android 7.0 Nougat (API Level 24), früher bekannt als "Android N". ___ tag123androidfileprovider ___ FileProvider ist eine Erweiterung der ContentProvder-Klasse von Android, die das einfache Freigeben privater Dateien zwischen Apps unterstützt. ___
Atif AbbAsi 25.04.2017 04:44
quelle