cancel
Showing results for 
Search instead for 
Did you mean: 

Accessing local files

RecoveryVR
Level 4
Hi all,

I'm looking to store video files locally on the Quest and access them from the apk through their file path.

To be clear, I'm trying to access the internal storage on the Quest via an installed apk. This would be a video stored in the movies folder or something similar that can be viewed inside the Quest through the Gallery. I am aware that the file path of the apk is available and looks something like /storage/emulated/0/Android/data/com.company.name/files but this is not what I need.

I am aware of obb expansion files but we are simply using too many external files to fit inside the size constraints of an apk + obb (approx. 7GB). This app will not be pushed to the store either so I'm not worried about any of those constraints, we will hopefully be using the enterprise edition.

Any help would be greatly appreciated!

EDIT: Solved
14 REPLIES 14

Andrew_Bindraw
Level 4
Hi. RiddleSystem.
Try use path /sdcard/my_folder/my_file
And don't forget about permissions: READ/WRITE in AndroidManifest.xml
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

If I am correct understood You .)

RecoveryVR
Level 4
Thanks for your response.

Yes, sorry, I did forget to mention that I've updated the android manifest with those permissions. 

Unfortunately the sdcard path doesn't seem to work either, does the Quest definitely use the same path as the Go?

I've tried a path similar to the first one because it made sense with the file structure you can see when you connect the Quest to a computer: "/storage/emulated/0/Movies/file.mp4". I'm really running out of ideas here, I feel like there is a simple solution that I'm missing 😞

Andrew_Bindraw
Level 4
Hi.
This is strange.
Make sure after install app permissions: WRITE/READ are granted
adb shell dumpsys package <package_name>
And check sections:
requested permissions:
install permissions:
android.permission.READ_EXTERNAL_STORAGE: granted=true
runtime permissions:

If granted=false 
adb shell pm grant <package_name> android.permission.READ_EXTERNAL_STORAGE
adb shell pm grant <package_name> android.permission.WRITE_EXTERNAL_STORAGE

And check again:
adb shell dumpsys package <package_name>

For my apps used path /sdcard/my_folder and read/write files work perfect on Oculus Go / Quest.

RecoveryVR
Level 4
That was it! 

Thank you so much for your help! That was driving me crazy.

Before I manually grant read/write permissions the dumpsys says
requested permissions:
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.READ_EXTERNAL_STORAGE

If I'm requesting permission but it's not being granted does this mean that my android manifest is incorrectly set up ? 

Here's what my manifest looks like: 

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.unity3d.player"
    xmlns:tools="http://schemas.android.com/tools"
    android:installLocation="preferExternal">
    <supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true"
        android:anyDensity="true"/>
    <application
        android:theme="@style/UnityThemeSelector"
        android:icon="@mipmap/app_icon"
        android:label="@string/app_name">
        <activity android:name="com.unity3d.player.UnityPlayerActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>
    </application>
 
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

</manifest>
This is in the Plugins/Android folder in the Unity project that is merged with Unity's default manifest. 

Thanks again for your help!

Andrew_Bindraw
Level 4
I am glad to help. Enjoy!

winterkewl
Level 3
Sorry to revive an old thread, but does anyone know if there's a way to grant these permissions without running the adb shell pm grant command? 

We deploy our apps directly to the quests for our exhibitions but the team that sideloads the .apk doesn't want to have to run these commands after each install.

Is there any way to grant these permissions via the AndroidManifest or inside of Unity itself?

+1 on this solution works, when I ran those commands my app could then load images and videos from the local storage of the Quest, so that's nice that it works but now we're looking to automate the process.

Thanks for sharing and in advance if you have any further insights.

Andrew_Bindraw
Level 4
Hi. winterkewl. Try set in AndroidManifest.xml
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="21" />

RecoveryVR
Level 4
Adding that line to manifest doesn't seem to get around this, they still appear in requested permissions but not runtime. The best I could find out, this is because read/write privileges are classified as dangerous permissions and as such need to be acknowledged by the user. i.e., when you first launch an application and you get a pop up asking to allow oculus to use the microphone (if it uses the oculus avatar stuff), when you click allow that is running a command to grant android.permission.RECORD_AUDIO . I believe that you would need to set up something similar with your application to ask the user to allow read/write permissions.  

Manually allowing permissions works for my purposes (so thanks once again cnn_id) as if it is done once, all updates proceeding that will still retain the same permissions as long as they have the same package name (com.name.name)

FUTC
Level 2
Sorry for reviving this thread again, but is there a way to keep the permissions for a package permanent? When I build my apk in unity and load it onto the oculus with adb I have to do adb pm grant for both storage permissions manually again. This is a bit annoying, is there a way to set the permissions to be permanent for a certain package name?