Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

Native Gallery for Android & iOS [Open Source]

Discussion in 'Assets and Asset Store' started by yasirkula, Feb 28, 2018.

  1. pavelsvs2012

    pavelsvs2012

    Joined:
    Oct 6, 2020
    Posts:
    8
    Hi, first of all, thank you so much for all the plugins that you do, I use almost all of them and everything works cool! Thanks!

    due to the update of the Google Play policy from November 1, 2021, they prohibit the use of WRITE_EXTERNAL_STORAGE and MANAGE_EXTERNAL_STORAGE without serious justifications (which of course I don't have, since I just get photos from the device/camera). After your update on November 4th, I saw that you were requesting READ_EXTERNAL_STORAGE permission in your manifest and wanted to ask:
    Do you know that this permission requires justification in the project in order to update the project after innovations? (Does Google think that this permission requires justification?)

    Or can I safely update the project and everything will be cool?
     
  2. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    WRITE_EXTERNAL_STORAGE has no effect on Android 11+ so Google shouldn't require justification for its existence. MANAGE_EXTERNAL_STORAGE does require justification but isn't used by Native Gallery. READ_EXTERNAL_STORAGE is used for getting media files from Gallery.
     
  3. pavelsvs2012

    pavelsvs2012

    Joined:
    Oct 6, 2020
    Posts:
    8
    Thank you very much!

    Tin, you really answer almost immediately, very cool! :D
     
    yasirkula likes this.
  4. wechat_os_Qy0_HKiEQBUSFlHzBG71eQWmw

    wechat_os_Qy0_HKiEQBUSFlHzBG71eQWmw

    Joined:
    Jun 15, 2021
    Posts:
    3
    Can anyone tell me how to limit the photo format in _NativeGallery_PickMedia
     
  5. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    You can't but it shouldn't matter because you should be able to create a Texture from all returned image paths using NativeGallery.LoadImageAtPath.
     
  6. TheGuy69

    TheGuy69

    Joined:
    Nov 30, 2021
    Posts:
    2
    Hi, so Im a complete noob when it comes to doing stuff like this... And since I haven't found any detailed information page, could you explain to me in detail, how I can simply let the user pick an Image, so I can then apply that Image as an texture?
    Thanks, Guy
     
  7. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
  8. TheGuy69

    TheGuy69

    Joined:
    Nov 30, 2021
    Posts:
    2
    Thanks a lot!
    Bye, Guy
     
    yasirkula likes this.
  9. unityvisualstudio2018

    unityvisualstudio2018

    Joined:
    Feb 8, 2020
    Posts:
    4
    Hi yasirkula,

    I have used Native Gallery plugin in a project and it is working perfectly fine in windows and mac. But I am facing an issue in ios while converting png image into Texture2D. The transparent portion of the png image turned black when loading png from a gallery in ios.

    I am using the below method for converting png to Texture2D.
    NativeGallery.LoadImageAtPath(imagePath,markTextureNonReadable:false).

    Please help.
     
  10. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    Where did you display the Texture2D? On a Quad, RawImage, etc.?
     
  11. unityvisualstudio2018

    unityvisualstudio2018

    Joined:
    Feb 8, 2020
    Posts:
    4
    Thanks for quick reply.
    I have set Texture2D to the material.mainTexture. Below is the code.

    rend.material.mainTexture= tex2d;

    I have attached sample png as well. You can check attached png on your end.
     

    Attached Files:

  12. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    Material needs to use a transparent shader and be in Transparent Render Order. Opaque shaders will show transparency as black.
     
  13. seyit25

    seyit25

    Joined:
    Sep 28, 2018
    Posts:
    13
    Thanks for the plugin. I'm having a problem while selecting a picture from the gallery; I pass the selected image to an image object, but it does not load immediately. When I press the upload image button again, it loads. What can I do to make the image I selected appear immediately?
     
  14. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    Can I see your code?
     
  15. seyit25

    seyit25

    Joined:
    Sep 28, 2018
    Posts:
    13
    int maxSize = 1024;
    try
    {
    NativeGallery.GetImageFromGallery((path) =>
    {
    if (path != null)
    {
    // Create Texture from selected image
    pickedImage = NativeGallery.LoadImageAtPath(path, maxSize, false);
    }
    });
    sprite = Sprite.Create(pickedImage,new Rect(0, 0, pickedImage.width, pickedImage.height), Vector2.one);
    profil_image.GetComponent<Image>().sprite = sprite;
    }
    catch (Exception)
    { }
     
  16. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    You should move your sprite lines immediately below the
    pickedImage =
    line.
     
    seyit25 likes this.
  17. seyit25

    seyit25

    Joined:
    Sep 28, 2018
    Posts:
    13
    Thanks, it worked.
     
    yasirkula likes this.
  18. richardzzzarnold

    richardzzzarnold

    Joined:
    Aug 2, 2012
    Posts:
    140
    Should the imported video automatically rotate in IOS to be correct orientation? Because that is not happening for me. I make two videos with iPad, (landscapeLeft and landscapeRight) but when I import each video, one is upside down. I cannot quite see how to determine its orientation. The code below does not seem to reveal anything.

    NativeGallery.VideoProperties videoProperties = NativeGallery.GetVideoProperties(vidPath);
    Debug.Log("VideoProperties" + videoProperties);
     
  19. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    videoProperties.rotation
    will return 180 for the upside-down video.
     
  20. tomekkie2

    tomekkie2

    Joined:
    Jul 6, 2012
    Posts:
    972
    I have a strange NativeGallery.Permission problem.
    I am trying to save image using: NativeGallery.Permission permission = NativeGallery.SaveImageToGallery(...).
    On Galaxy S8 with Android 9 - I am getting Permission.Denied (despite the system shows the write permission is on), while on Galaxy A7(2018) with Android 10 - I am getting Permission.Granted and everything is o.k.

    On the other AR app the Native Gallery works the same on both phones.

    Any modifications of Plugins/Android/AndroidManifest.xml file do not bring any effect.

    This is my instant_app_manifest/release file :
     

    Attached Files:

    Last edited: Dec 9, 2021
  21. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    Can you change write permission to
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="replace" />
    and add
    xmlns:tools="http://schemas.android.com/tools"
    to the outermost
    manifest
    element?
     
  22. tomekkie2

    tomekkie2

    Joined:
    Jul 6, 2012
    Posts:
    972
    I have already placed this file in Assets/Plugins/Android - but without any effects.
     

    Attached Files:

  23. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    Placing this inside that folder won't have any effect because Unity deliberately looks for AndroidManifest.xml filename in that folder. You'll need to modify the AndroidManifest.xml file (temporarily, if you wish).
     
    tomekkie2 likes this.
  24. tomekkie2

    tomekkie2

    Joined:
    Jul 6, 2012
    Posts:
    972
    This one inside <InstallDir>\Editor\Data\PlaybackEngines\AndroidPlayer\Apk ?
     
  25. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    Unity won't recognize Assets/Plugins/Android/UnityManifest.xml. It recognizes only Assets/Plugins/Android/AndroidManifest.xml. Can't you modify that file? If it doesn't exist, you can enable Custom AndroidManifest from Player Settings for testing purposes.
     
    tomekkie2 likes this.
  26. tomekkie2

    tomekkie2

    Joined:
    Jul 6, 2012
    Posts:
    972
    Thanks a lot.
    That worked this time.
    I have just copied the file and skipped renaming it from UnityManifest to AndroidManifest.
     
  27. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    Wait you just replaced AndroidManifest.xml with the one you've posted in your previous message without adding tools:node attribute to the xml and it just worked?
     
  28. tomekkie2

    tomekkie2

    Joined:
    Jul 6, 2012
    Posts:
    972
    I did add this attribute.
    This is my final file in Assets/Plugins/Android. (I just had to add .txt to the extension).
    Thanks a lot.
    It works on both Galaxy S8 and A7(2018) now.
     

    Attached Files:

    yasirkula likes this.
  29. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    Your previous one had things like com.google.ar.core.min_apk_version, you might want to copy them to your new AndroidManifest. Or you can just edit the old manifest :D
     
    tomekkie2 likes this.
  30. tomekkie2

    tomekkie2

    Joined:
    Jul 6, 2012
    Posts:
    972
    But where can I check the final manifest, which is supposed to be the result of merging various manifest files?

    The manual says:

    "To examine the final Android manifest that Unity generates for your app, open the Temp/StagingArea/AndroidManifest.xml"

    But I can find only UnityManifest.xml in the Temp/StagingArea folder.
     
  31. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    I could no longer find the merged manifest at that path. But you can use Android Studio's Analyze APK feature to achieve this.
     
    tomekkie2 likes this.
  32. tomekkie2

    tomekkie2

    Joined:
    Jul 6, 2012
    Posts:
    972
    I have opened the Android Studio
    - went to File/Profile or Debug Apk menu
    - then opened my apk file and navigated to AndroidManifest.xml
    Here is what was inside:
    Code (CSharp):
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <manifest
    3.     xmlns:android="http://schemas.android.com/apk/res/android"
    4.     android:versionCode="1"
    5.     android:versionName="0.1"
    6.     android:installLocation="2"
    7.     android:compileSdkVersion="29"
    8.     android:compileSdkVersionCodename="10"
    9.     package="com.vp.ARarchitecture"
    10.     platformBuildVersionCode="29"
    11.     platformBuildVersionName="10">
    12.  
    13.     <uses-sdk
    14.         android:minSdkVersion="25"
    15.         android:targetSdkVersion="29" />
    16.  
    17.     <supports-screens
    18.         android:anyDensity="true"
    19.         android:smallScreens="true"
    20.         android:normalScreens="true"
    21.         android:largeScreens="true"
    22.         android:xlargeScreens="true" />
    23.  
    24.     <uses-feature
    25.         android:glEsVersion="0x30000" />
    26.  
    27.     <uses-permission
    28.         android:name="android.permission.INTERNET" />
    29.  
    30.     <uses-permission
    31.         android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    32.  
    33.     <uses-feature
    34.         android:name="android.hardware.touchscreen"
    35.         android:required="false" />
    36.  
    37.     <uses-feature
    38.         android:name="android.hardware.touchscreen.multitouch"
    39.         android:required="false" />
    40.  
    41.     <uses-feature
    42.         android:name="android.hardware.touchscreen.multitouch.distinct"
    43.         android:required="false" />
    44.  
    45.     <uses-permission
    46.         android:name="android.permission.CAMERA" />
    47.  
    48.     <uses-feature
    49.         android:name="android.hardware.camera.ar"
    50.         android:required="true" />
    51.  
    52.     <uses-feature
    53.         android:name="com.google.ar.core.depth"
    54.         android:required="true" />
    55.  
    56.     <queries>
    57.  
    58.         <package
    59.             android:name="com.google.ar.core" />
    60.     </queries>
    61.  
    62.     <uses-permission
    63.         android:name="android.permission.READ_EXTERNAL_STORAGE" />
    64.  
    65.     <application
    66.         android:label="@ref/0x7f060005"
    67.         android:icon="@ref/0x7f040000"
    68.         android:banner="@ref/0x7f010000"
    69.         android:isGame="true"
    70.         android:extractNativeLibs="true"
    71.         android:roundIcon="@ref/0x7f040001"
    72.         android:requestLegacyExternalStorage="true">
    73.  
    74.         <activity
    75.             android:theme="@ref/0x7f070001"
    76.             android:name="com.unity3d.player.UnityPlayerActivity"
    77.             android:launchMode="2"
    78.             android:screenOrientation="10"
    79.             android:configChanges="0x40003fff"
    80.             android:hardwareAccelerated="false">
    81.  
    82.             <intent-filter>
    83.  
    84.                 <action
    85.                     android:name="android.intent.action.MAIN" />
    86.  
    87.                 <category
    88.                     android:name="android.intent.category.LAUNCHER" />
    89.  
    90.                 <category
    91.                     android:name="android.intent.category.LEANBACK_LAUNCHER" />
    92.             </intent-filter>
    93.  
    94.             <meta-data
    95.                 android:name="unityplayer.UnityActivity"
    96.                 android:value="true" />
    97.         </activity>
    98.  
    99.         <meta-data
    100.             android:name="unity.splash-mode"
    101.             android:value="0" />
    102.  
    103.         <meta-data
    104.             android:name="unity.splash-enable"
    105.             android:value="true" />
    106.  
    107.         <meta-data
    108.             android:name="unity.build-id"
    109.             android:value="fe37f409-7bae-46fd-84d4-da22893a571b" />
    110.  
    111.         <meta-data
    112.             android:name="unityplayer.SkipPermissionsDialog"
    113.             android:value="true" />
    114.  
    115.         <meta-data
    116.             android:name="com.google.ar.core"
    117.             android:value="required" />
    118.  
    119.         <meta-data
    120.             android:name="com.google.ar.core.min_apk_version"
    121.             android:value="210910000" />
    122.  
    123.         <activity
    124.             android:theme="@ref/0x0103023a"
    125.             android:name="com.google.ar.core.InstallActivity"
    126.             android:exported="false"
    127.             android:excludeFromRecents="true"
    128.             android:launchMode="1"
    129.             android:configChanges="0x4a0" />
    130.     </application>
    131. </manifest>
     
  33. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    Looks good to me :)
     
    tomekkie2 likes this.
  34. kMasakiK

    kMasakiK

    Joined:
    Aug 11, 2018
    Posts:
    7
    Can I use this plugin to get images in bulk by date without opening the photo gallery?
     
  35. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    Not with this plugin, sorry.
     
  36. kMasakiK

    kMasakiK

    Joined:
    Aug 11, 2018
    Posts:
    7
    Thanks!
     
  37. AndrewOleynik

    AndrewOleynik

    Joined:
    Feb 27, 2015
    Posts:
    8
    Hi, thanks for the plugin!

    I have a question.
    Now when I start the file selection of any file ("GetMediaFromGallery" method), the application is paused and the focus is lost.
    OnApplicationFocus: false
    OnApplicationPause: true

    And after the selection, everything is restored:
    OnApplicationFocus: true
    OnApplicationPause: false

    Is it possible to open a native gallery without stopping the application?

    The problem is that when the application is restored, a visual bug appears.
    Is it possible to have an application in the background?
    (Close native gallery -> Visual bug -> Show unity app)

    Android 7 (Flume)
    Meizu M5 Note
     

    Attached Files:

    Last edited: Dec 27, 2021
  38. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    I'm sorry for the late reply. I don't think this is possible without coding a custom Gallery UI because the picked Gallery app is launched as an Activity and AFAIK, you can't run 2 Activities simultaneously. Unity will freeze while the gallery app is open.
     
  39. Justinger

    Justinger

    Joined:
    Nov 5, 2014
    Posts:
    3
    First of all, thank you for your really great plugin.
    It is working great for us, however a client ran an Android security audit on our app and has flagged the use of broadcast receivers that are not protected by a permission. The only receivers that I've been able to find in my project seem to be inside Native Gallery. I don't imagine this is actually very serious, but we need to be in compliance to proceed.

    "Context registered broadcast receivers are not being protected with permission. A malicious app could attempt to send broadcast intents that trigger your unprotected broadcast receivers. "
    Receiving Broadcast Permissions

    I have very little experience with Javascipt and have never modified a plugin before, so I was hoping to run this problem by you. I see you have NativeGalleryMediaReceiver and NativeGalleryPermissionReceiver, but I cannot tell if these are strictly custom or the receivers being referred to. Perhaps registerReceiver or a manifest <receiver> flag could resolve this?

    I see that a permission could be added to the sendBroadcast at line 274 of NativeGallery.java (not 100% sure of the syntax), but I would think that this is just for BROADCAST, and they seem entirely concerned about RECEIVERS, so probably unrelated.
    Code (JavaScript):
    1. context.sendBroadcast( mediaScanIntent ); // original
    2. context.sendBroadcast( mediaScanIntent, Manifest.permission.READ_EXTERNAL_STORAGE ); // restricted?

    Thanks for any help you can give to resolve this unanticipated client concern. I know that this issue might not actually live in your plugin, but may be buried deep somewhere else, and if so I'm sorry for the distraction.

    Thanks
     
  40. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    Hi! The only BroadcastReceiver that I have in my plugins is in NativeShare. NativeGalleryMediaReceiver and NativeGalleryPermissionReceiver aren't related, I've just named them like that. And
    context.sendBroadcast
    doesn't seem related to me either :)
     
    Justinger likes this.
  41. Justinger

    Justinger

    Joined:
    Nov 5, 2014
    Posts:
    3
    Thank you for your response. I really appreciate it.
     
    yasirkula likes this.
  42. Sohaibkhan99

    Sohaibkhan99

    Joined:
    Dec 1, 2020
    Posts:
    3
    sir i want to upload image in unity 2D background from gallery how i can pick from gallery Not UI without UI
     
  43. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    You can't pick images from Gallery without the image picker UI.
     
  44. Rkikaku

    Rkikaku

    Joined:
    May 31, 2017
    Posts:
    1
    こんにちは UnityCloudbuildでAndroidをビルドしたときに、
    2: No Library cache found - ALL assets will be re-imported.
    3: [Unity] Initialize engine version: 2020.3.27f1 (e759542391ea)
    4: [Unity] UnityEngine.Debug:LogWarningFormat (string,object[])
    5: [Unity] ERROR:
    6: [Unity] ERROR: Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
    7: [Unity] java.lang.RuntimeException: Duplicate class com.yasirkula.unity.NativeGallery found in modules NativeGallery-runtime.jar :)NativeGallery:) and NativeGallery.jar (NativeGallery.jar)
    8: [Unity] java.lang.RuntimeException: Duplicate class com.yasirkula.unity.NativeGallery found in modules NativeGallery-runtime.jar :)NativeGallery:) and NativeGallery.jar (NativeGallery.jar)
    9: [Unity] java.lang.RuntimeException: Duplicate class com.yasirkula.unity.NativeGallery found in modules NativeGallery-runtime.jar :)NativeGallery:) and NativeGallery.jar (NativeGallery.jar)
    10: [Unity] java.lang.RuntimeException: Duplicate class com.yasirkula.unity.NativeGallery found in modules NativeGallery-runtime.jar :)NativeGallery:) and NativeGallery.jar (NativeGallery.jar)
    11: [Unity] at UnityEditor.Android.Command.WaitForProgramToRun (UnityEditor.Utils.Program p, UnityEditor.Android.Command+WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg) [0x00033] in <b3cb3e8dc74c43a6a86b595abf419282>:0
    12: [Unity] at UnityEditor.Android.Command.Run (System.Diagnostics.ProcessStartInfo psi, UnityEditor.Android.Command+WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg) [0x0002d] in <b3cb3e8dc74c43a6a86b595abf419282>:0
    13: [Unity] at UnityEditor.Android.Command.Run (System.String command, System.String args, System.String workingdir, UnityEditor.Android.Command+WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg) [0x0000a] in <b3cb3e8dc74c43a6a86b595abf419282>:0
    14: [Unity] at UnityEditor.Android.AndroidJavaTools.RunJava (System.String args, System.String workingdir, System.Action`1[T] progress, System.String error) [0x0001f] in <b3cb3e8dc74c43a6a86b595abf419282>:0
    15: [Unity] Rethrow as GradleInvokationException: Gradle build failed
    16: [Unity] Rethrow as BuildFailedException: Exception of type 'UnityEditor.Build.BuildFailedException' was thrown.
    17: [Unity] ERROR: Player export failed. Reason: CommandInvokationFailure: Gradle build failed.
    18: [Unity] java.lang.RuntimeException: Duplicate class com.yasirkula.unity.NativeGallery found in modules NativeGallery-runtime.jar :)NativeGallery:) and NativeGallery.jar (NativeGallery.jar)
    19: ! build of 'default-android' failed. exit
    20: WARNING: Unity Version is different from previous build.
    21: publishing finished successfully.
    22: Finished: FAILURE
    と出てしまいます どのようにすればよろしいでしょうか?
     
  45. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    I'm guessing this started happening after updating the plugin. You should delete the plugin and reimport it from scratch, it should resolve the issue.
     
  46. hatibnb_unity

    hatibnb_unity

    Joined:
    Mar 2, 2021
    Posts:
    6
    hi , can some one help me for IOS . the issue i m facing is when i open camera it asks for the permission to access the camera but when i try to access the photos / gallery it directly takes me to the photo library without asking the permission to access the photos .
    i m using the sample code where it seems bypassing the permission or might be IOS 14 does not require the photo permission can some one explain thanks

    Code :
    public void imageload()
    {
    NativeGallery.Permission permission = NativeGallery.GetImageFromGallery((path) =>
    {
    Debug.Log("Image path: " + path);
    if (path != null)
    {
    // Create Texture from selected image
    Texture2D texture = NativeGallery.LoadImageAtPath(path, maxSize);
    if (texture == null)
    {
    Debug.LogError("Couldn't load texture from " + path);
    return;
    }
    SelectedImage.texture = texture;
    }
    });
    }
     
  47. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    You're right: "NativeGallery doesn't require any permissions for picking images/videos from Photos on iOS 11+"
     
  48. dk_sam

    dk_sam

    Joined:
    Mar 11, 2021
    Posts:
    2
    Hi @yasirkula, Thank you for creating and sharing this cool and useful package.
    I'm a beginner in Unity, so I don't know how to get the byte array byte[] mediaBytes for NativeGallery.SaveVideoToGallery( byte[] mediaBytes,....)
    It's not included in the example code in GitHub.
    Could you please clarify how to do it?

    And another question:
    Where are the images stored when I save a frame when the program is running on the Unity Editor?

    Thanks
     
  49. yasirkula

    yasirkula

    Joined:
    Aug 1, 2011
    Posts:
    2,865
    Hi, byte[] can be obtained in numerous ways. For example, you can download bytes from a network url, read bytes of a file (File.ReadAllBytes) and so on. Usually, though, if you can obtain a file's bytes, you already have access to a file in the local file system. In that case, it's better to pass that file's file path to SaveVideoToGallery.

    SaveImageToGallery doesn't save the frames to file system on editor.
     
  50. DeemaAlyousef

    DeemaAlyousef

    Joined:
    Feb 9, 2022
    Posts:
    4
    Hello ,

    it difficult for me to use the plugin , i want to save a photo from unity game into IOS gallery album , i have SAVE button so when the user click it , it should save the photo to the gallery album , can you please help me with this ? i'm really struggling .