currently we're porting 2 applications (from Windows), both programs do different tasks and is on separate programs because it is designed this way, one program will do the UDP communication basically a daemon and it will translate those UDP packets to json and it will write to a file, the other program will read to that file and it will display to the user. But on the Android file system it seems impossible, I have to deal with storage permissions and basically I can't find a solution, I need a folder in Android that allows reading and writing of files from 2 programs simultaneously without worrying about permissions.
I have tried all the folders in Android.OS.Environment and seems like there's no folder that allows such thing, I'm working on Android Q and I can't even create a file on storage/emulated/0, is there any way for this to happen?
Related
We have built an Android application which is used to collect data (for volleyball stats). This application creates a data file which we ultimately want to be transferred to desktop computers (Windows PCs and Macintoshes).
We currently write the data out as a simple character stream in the default application directory (data/data/appname/files) and specify MODE_WORLD_READABLE when we create each of these data files.
The problem is that even though the data files are MODE_WORLD_READABLE, the various utilities which we would like to use to transfer the data cannot see the data files. I assume that the problem is that they may have read access to the files, but they do not have read access to the directories in which the files are stored. Specifically, I am unable to browse to the files using the ES File Explorer app on the Android device and I am unable to browse to the files when I connect my Android device to the PC or Macintosh as a USB device.
Is my only solution to write files to the external directories, or is there something I am missing here about using MODE_WORLD_READABLE with application directories?
The file access mode for the application base directory (usually something like /data/data/com.package.app) and the top directories in it (databases, files, cache, ...) is rwxrwx--x. For other users than the application itself the relevant part is --x, which mean the directories can not be read (browsed) but they can be traversed. So you can read MODE_WORLD_READABLE files if you know exactly what you are looking for (the complete path).
We currently write the data out as a simple character stream in the
default application directory (data/data/appname/files) and specify
MODE_WORLD_READABLE when we create each of these data files.
AFAIK you cant access files from application sandbox (i.e /data/data/appname/files).If it were possible then you may never have used Content Providers.
The only solution i see here is whatever you want to achieve is only possible on Rooted Devices
According to the Android Development Documentation, you can't just open any file you want ("Open a private file associated with this Context's application package for writing.").
What, however, when I want my application to read files created by other applications? Let's say I have a file in /data/app_1/hello.txt, but my application has nothing to do with it because my app is called app_2, how would I still be able to open this file (and write back to it)?
You can't in general, Applications on Android are isolated and sparated. A application can only write and read its own files.
There are exceptions: As the documentation states: "It's possible to arrange for two applications to share the same Linux user ID, in which case they are able to access each other's files. To conserve system resources, applications with the same user ID can also arrange to run in the same Linux process and share the same VM (the applications must also be signed with the same certificate)."
Another possiblity is that the files are created as "world readable" so that every application can read it.
So to summarize and come back to your question: If you can not modify "my_app_1" then it is impossible. Of you can modify both applications choose one of the solutions above.
Two options:
If you are designing both applications and want to share the file, keep it somewhere else (for example - external storage) or make it world readable.
If you are trying to read another app's file - well, you shouldn't, that's a key element in the android security architecture.
hello guys i need small help in understanding file system of android
Now in windows for example we create files using paths like "c:/mytextfile.txt" or "c:/folder/mytextfile.txt".Now how can i access files and folders in android i mean whats the path like.
Does the phone support file browser instead of relying on third party apps??
Android does not have a native file browser, but there are numerous third-party ones (Astro comes to mind). The filesystem of Android is that of Linux; the path separator is / and the FS grows from a single root called /. So, you have your app packages under /data/apps, and so forth. Unless the phone is jailbroken ("rooted"), you won't get to see the whole filesystem - permissions get in the way. This applies to all Android applications, they are sandboxed - that is, they don't get access the whole filesystem. There are API calls to get the path to the current application's sandbox directory.
My android application needs another NATIVE application executable to run before the android one, so that they can communicate through sockets. Android application has a JNI layer for handling the client-side communication.
Now i need to bundle up the native executable along with the apk file, so that when it is installed on a device it gets unzipped into either the phone memory or the memory card.
How do i do this?
I tried keeping the native executable in res/asset and in res/raw folders, but they still don't get unzipped in /data/data/ folder.
One way I could find is to use AssetManager and then with help of InputStream and OutputStream, i can write this file onto the device the first time it is run and then use it. But there is no point to write it manually on phone memory as it might eat up the memory. ( the case where if memory card is not present. )
Can anyone help me on how can i achieve this? It would be great if there is an option to unzip the necessary files automatically at the time of installation.
How do i do this?
You don't. You unpack it yourself on first run of your application.
One way I could find is to use AssetManager and then with help of InputStream and OutputStream, i can write this file onto the device the first time it is run and then use it.
Correct.
But there is no point to write it manually on phone memory as it might eat up the memory.
Then why did you want it automatically unpacked there in the first place?
It would be great if there is an option to unzip the necessary files automatically at the time of installation.
No, sorry, this is not possible.
We have the same issue ... the direction we are exploring is to have two separate installs - the first one is the app and the second one is the data-app. When the data-app installs it copies the binary files to the SD card. When we uninstall the data-app it frees up the internal storage.
We don't have this one completely licked yet, and would love to hear other input and maybe find someone to help us by writing a couple of skeletal sample applications for us.
There are so many people who are in this boat (based on my googling) that if this approach doesn't work I suggest we (or someone) set up a generic file delivery web server and generic file delivery Android service and make it available to developers for a very low cost.
This isn't a typical use of OBBs but why not use one? It would then be a file separate to your apk installed in a pre-determined location. It doesn't have to be compressed.
I have 2 binary files that i would like to package with my apk. (/res/raw)
i need to copy these 2 files to /sdcard when the application is run
how can i do this?
We have the same issue ... the direction we are exploring is to have two separate installs - the first one is the app and the second one is the data-app. When the data-app installs it copies the binary files to the SD card. When we uninstall the data-app it frees up the internal storage.
We don't have this one completely licked yet, and would love to hear other input and maybe find someone to help us by writing a couple of skeletal sample applications for us.
There are so many people who are in this boat (based on my googling) that if this approach doesn't work I suggest we (or someone) set up a generic file delivery web server and generic file delivery Android service and make it available to developers for a very low cost.
You need to use the AssetManager.
That will give you can InputStream that you can copy to a FileOutputStream.
It all depends on what your goal is by doing this.
Are you trying to be nice to the user and conserve disk space on the device by moving files to the sdcard? Or do you merely want to ensure that these files are on the sd card?
If you just want to put the files on the sdcard then you should use the AssetManager as CaseyB mentioned
If you are trying to conserve phone memory then consider distributing the apk file without the 2 raw files, and then on first run download the files from a server that you have set up. This may cause a bit of a problem due to the time needed to download the files, but some users on devices with limited memory available on the device itself will be appreciative of it.