Android Code Snippet Add image to Gallery Android 5 - 10+

Status
Not open for further replies.
Depends on: Phone, JavaObject and ContentResolver libraries

Code:
Sub AddBitmapToGallery (In As InputStream, TargetName As String, MimeType As String, RelativePath As String = "")
    Dim p As Phone
    Dim ctxt As JavaObject
    ctxt.InitializeContext
    If p.SdkVersion >= 29 Then
        Dim cr As ContentResolver
        cr.Initialize("cr")
        Dim values As ContentValues
        values.Initialize
        values.PutString("_display_name", TargetName)
        values.PutString("mime_type", MimeType)
        If RelativePath <> "" Then
            values.PutString("relative_path", RelativePath)
        End If
        Dim MediaStoreImagesMedia As JavaObject
        MediaStoreImagesMedia.InitializeStatic("android.provider.MediaStore.Images$Media")
        Dim EXTERNAL_CONTENT_URI As Uri = MediaStoreImagesMedia.GetField("EXTERNAL_CONTENT_URI")
        If RelativePath <> "" Then
            cr.Delete(EXTERNAL_CONTENT_URI, "_display_name = ? AND relative_path = ?", Array As String(TargetName, RelativePath))
        Else
            cr.Delete(EXTERNAL_CONTENT_URI, "_display_name = ?", Array As String(TargetName))
        End If
        Dim imageuri As JavaObject = cr.Insert(EXTERNAL_CONTENT_URI, values)
        Dim out As OutputStream = ctxt.RunMethodJO("getContentResolver", Null).RunMethod("openOutputStream", Array(imageuri))
        File.Copy2(In, out)
        out.Close
    Else
        Dim rp As RuntimePermissions
        rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
        Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) 'change to Activity if not using B4XPages
        If Result Then
            Dim out As OutputStream = File.OpenOutput(File.DirRootExternal, "Pictures/" & TargetName, False)
            File.Copy2(In, out)
            out.Close
            Dim FilePath As String = File.Combine(File.DirRootExternal, "Pictures/" & TargetName)
            Dim MediaScannerConnection As JavaObject
            MediaScannerConnection.InitializeStatic("android.media.MediaScannerConnection")
            Dim interface As Object = MediaScannerConnection.CreateEventFromUI("android.media.MediaScannerConnection.OnScanCompletedListener", "ScanCompleted", _
                   Null)
            MediaScannerConnection.RunMethod("scanFile", Array(ctxt, Array As String(FilePath), Array As String(MimeType), interface))
            Wait For ScanCompleted_Event (MethodName As String, Args() As Object)
            Log(Args(0))
            Log(Args(1))
        End If
    End If
End Sub

Usage example:
Code:
AddBitmapToGallery(File.OpenInput(File.DirAssets, "logo.png"), "logo.png", "image/png", "Pictures/MyApp/")

No permission is required in Android 10+.

Updates:
- Added optional relative path parameter. When set as in the above example (and note the trailing slash), the images will be organized in the folder. On Android 10+.
 
Last edited:
Depends on: Phone, JavaObject and ContentResolver libraries

Code:
Sub AddBitmapToGallery (In As InputStream, TargetName As String, MimeType As String)
    Dim p As Phone
    Dim ctxt As JavaObject
    ctxt.InitializeContext
    If p.SdkVersion >= 29 Then
        Dim cr As ContentResolver
        cr.Initialize("cr")
        Dim values As ContentValues
        values.Initialize
        values.PutString("_display_name", TargetName)
        values.PutString("mime_type", MimeType)
        Dim MediaStoreImagesMedia As JavaObject
        MediaStoreImagesMedia.InitializeStatic("android.provider.MediaStore.Images$Media")
        Dim EXTERNAL_CONTENT_URI As Uri = MediaStoreImagesMedia.GetField("EXTERNAL_CONTENT_URI")
        cr.Delete(EXTERNAL_CONTENT_URI, "_display_name = ?", Array As String(TargetName))
        Dim imageuri As JavaObject = cr.Insert(EXTERNAL_CONTENT_URI, values)
        Dim out As OutputStream = ctxt.RunMethodJO("getContentResolver", Null).RunMethod("openOutputStream", Array(imageuri))
        File.Copy2(In, out)
        out.Close
    Else
        Dim rp As RuntimePermissions
        rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
        Wait For B4XPage_PermissionResult (Permission As String, Result As Boolean) 'change to Activity if not using B4XPages
        If Result Then
            Dim out As OutputStream = File.OpenOutput(File.DirRootExternal, "Pictures/" & TargetName, False)
            File.Copy2(In, out)
            out.Close
            Dim FilePath As String = File.Combine(File.DirRootExternal, "Pictures/" & TargetName)
            Dim MediaScannerConnection As JavaObject
            MediaScannerConnection.InitializeStatic("android.media.MediaScannerConnection")
            Dim interface As Object = MediaScannerConnection.CreateEventFromUI("android.media.MediaScannerConnection.OnScanCompletedListener", "ScanCompleted", _
                   Null)
            MediaScannerConnection.RunMethod("scanFile", Array(ctxt, Array As String(FilePath), Array As String(MimeType), interface))
            Wait For ScanCompleted_Event (MethodName As String, Args() As Object)
            Log(Args(0))
            Log(Args(1))
        End If
    End If
End Sub

Usage example:
Code:
AddBitmapToGallery(File.OpenInput(File.DirAssets, "logo.png"), "logo.png", "image/png")

No permission is required in Android 10+.
That's very helpful, how about removing a bitmap from the gallery?
 
Erel,


I would like to save my bitmap to Gallery Folder by calling :

AddBitmapToGallery(File.OpenInput(File.DirAssets, "logo.png"), "logo.png", "image/png")

but i have the image in Bitmap variable already. How can i convert my bitmap to Inputstream?

*I dont want to save then reopen again
 
Status
Not open for further replies.
Back
Top