Reading File from Internal storage with No Read/Write Permissions? - android

I have a file on Internal Storage on the path e.g. /data/data/<package name>/folder/myfile
I don't have permissions to access this file but for my implementation I have to read this file. for this purpose I first run su command on the file and set permissions through chmod command to 777and then try to access the file. but still show that file does not exist. Please tell how can I can get this file to read.
Following is what I am trying to do.
public void runChmodAndSU(String filePath)
{
Process chperm;
try {
chperm = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(chperm.getOutputStream());
os.writeBytes("chmod 777 "+ filePath +"\n");
os.writeBytes("exit\n");
os.flush();
chperm.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
After running above code I check it this way:
File myFile = new File(filePath);
if (myFile.exists())
{
Log.e("Success!", "myFile Exists");
}
else {
Log.e("Failure!", "myFile Does not Exists");
}
Please tell me how can I read this very file. Is there any other way to access files you don't have permissions to?

You can't nor should you be allowed to access such files without the appropriate permissions set in AndroidManifest.xml for your application.
I can't tell if you were intending this to be a "hack android for me please?" question, or if you just don't know what android's uses-permission is about, but the way your question is worded, you really shouldn't be able to access the file.

If su is working, try chmod -R 777 /data/data/<package name>/

Related

Cannot run program "...\bin\ffmpeg.exe": error=13, Permission denied

Trying for this Jave program to work on my android where the host is a Windows 64 bit machine. Have created a class and extended FFMPEGLocator class defining the path to the ffmpeg executable in my file system. But doesn't seem to work each time showing "error 13, permission denied". Could someone please put some light into this situation?
Class extended
class SampleLocator extends FFMPEGLocator {
#Override
protected String getFFMPEGExecutablePath() {
return "...\\bin\\ffmpeg.exe";
} }
audio converting code
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
File source = new File(url);
targetFile = new File(path, "sample.wav");
AudioAttributes audio = new AudioAttributes();
audio.setCodec("pcm_s16le");
audio.setBitRate(64000);
audio.setChannels(2);
audio.setSamplingRate(44100);
EncodingAttributes attrs = new EncodingAttributes();
attrs.setFormat("wav");
attrs.setAudioAttributes(audio);
Encoder encoder = new Encoder(new MyDefaultFFMPEGLocator());
try {
encoder.encode(source, targetFile, attrs);
}
catch (IllegalArgumentException | InputFormatException e){
e.printStackTrace();
} catch (EncoderException e) {
e.printStackTrace();
}
So this is how I solved this Permission denied error. You first have to instantiate the ffmpeg executable file instance and then provide the execute permission code pointing the ffmpeg executable file path.
Used the help of this open source project
ffmpeg-android
Runtime.getRuntime().exec("chmod -R 777 " + ffmpeg.getAbsolutePath()).waitFor();

How can one create/ delete files in the /data/data dir using root in Android?

I'm working on a POC where I need to create and later on delete a file in the /data/data dir of a rooted device. I have tried to create a file in the standard way but it throws an PERMISSION_DENNIED exception as expected.
I know this is possible because the Root Explorer app can do it.
How can I programatically create/ delete a file via root?
Thank in advance!
Based on #GabeSechan comment I was able to achieve this using this commands.
Create new file:
final String[] sCommand = {"su", "-c", "touch /data/..."};
try {
Runtime.getRuntime().exec(sCommand);
} catch (Exception e) {
Log.e(TAG, "Issue occurred while creating new file " + e.getMessage());
}
}
And delete file:
final String[] sCommand = {"su", "-c", "rm /data/..."};
try {
Runtime.getRuntime().exec(sCommand);
} catch (Exception e) {
Log.e(TAG, "Issue occurred while deleting " + e.getMessage());
}

how to create .bin file on external storage

I used a lot of examples trying to understand why it doesnt create my file but i didn't and i need some help.
File myFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "FFFFFFFFF.bin");
try {
myFile.createNewFile();
setOutputStream(new FileOutputStream(myFile));
for (short i = 1; i <= this.array.length; i++) {
this.array[i-1] = new myobject(i);
}
get_objOutputStream().writeObject(this.array);
getOutputStream().close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
the getters/setters are regular, it worked when i wrote it to internal file before i changed it a little so the problem is not an error or related to the array of my objects
thanks for any help
updates:
i got no errors, it just run and then i cant find the file when im looking for it when i plug my phone to my pc after installing and running.
and yes i did wrote the premition, that is not the problem
Did you add permission in manifest file?
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Can I write file in root directory android?

I have a question that I can write a file in root directory by this code?
when I test on emulator then it can write at path: /data/data/com.example.test/files/g.gc
but i donot know that i can write file on device, because i donot have any device to check it.
public static void saveFile(Context context, String content) {
try {
FileOutputStream fw = context.openFileOutput("g.gc", Context.MODE_PRIVATE);
fw.write( content);
fw.close();
} catch (IOException e) {}
}
No you cannot write to root because you do not have permission to. Your application must have an elevated UID level access to be able to write into the root directory.
If you're an app, don't bother.

Created folder is not visible in the file explorer..

I have a problem with creating a folder and a file on the sdcard.
Here's the code:
File folder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString() + "/folder");
boolean success;
if (!folder.exists()) {
success = folder.mkdirs();
}
File obdt = new File(folder, "file.txt");
try {
success = obdt.createNewFile();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
With this code I expect to create the folderfolder in the Download folder of the sdcard and in this the file file. I want that the user can access the file. So I want to put it in a shared folder.
The success variable is true and when I run the code again the folder already exists and doesnt come in the if-block.
But I can't see the created folder and file on the sdcard in file explorer.
Info:getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString() returns storage/sdcard/Download
I work with a Galaxy Nexus.
Damn! :)
Now I solved my problem...I was misunderstanding the operation of creating files in the file system.
When I spoke of file explorer I meant the file explorer of the operating system and NOT the file explorer in the DDMS :).
I thought when I create a file I will see it in the file explorer of the operating system but when the device is connected to the PC the files can only be seen in the DDMS file explorer.
Sorry I'm new to Android ;)
When the App is running standalone without PC connection and afterwards I connect with the PC I see the created files and folders of course :)
Thanks for help
Any errors from logcat?
Else: try something like Log.I("PATHNAME",folder.absolutePath()); and then look in your logcat to make sure where you are creating the folder where you think it is.
If you haven't done so already, you will need to give your app the correct permission to write to the SD Card by adding the line below to your Manifest:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
If you have already done that see if :
File obdt = new File(/sdcard/folder/file.txt)
try {
success = obdt.createNewFile();
} catch (IOException e1) {
e1.printStackTrace();
}
works.
You cannot see the folder/file in explorer? Maybe it is because the MediaScanner is active, but not adding your files. You can do this in your program or switch the Media Scanner of somewhere in your phone settings.
MediaScanner
Trigger MediaScanner
Try this out.
File dir = new File(Environment.getExternalStorageDirectory()
+ "/XXX/Wallpapers/");
File[] files = dir.listFiles();
if (files == null)
{
int numberOfImages = 0;
BitmapDrawable drawable = (BitmapDrawable) imageView
.getDrawable();
Bitmap bitmap = drawable.getBitmap();
File sdCardDirectory = Environment
.getExternalStorageDirectory();
new File(sdCardDirectory + "/XXX/Wallpapers/").mkdirs();
File image = new File(sdCardDirectory
+ "/XXX/Wallpapers/Sample" + numberOfImages + ".JPG");
boolean success = false;
FileOutputStream outStream;
try {
outStream = new FileOutputStream(image);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
outStream.flush();
outStream.close();
success = true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (success) {
Toast.makeText(
getApplicationContext(),
"Image saved successfully in Sdcard/XXX/Wallpapers",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(),
"Error during image saving", Toast.LENGTH_LONG)
.show();
}
Dont forget to add permission in manifest
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Apparently there is a known bug in MTP.
Issue 195362
All phones using MTP instead of USB Mass storage do not properly show the list of files when that phone is connected to a computer using a USB cable. Android apps running on the device also cannot see these files.
It is actually as old as 2012
I've encountered the same problem: created files and folders don't show immediately after being written to sdcard, despite the file being flushed and closed !!
They don't show on your computer over USB or a file explorer on the phone.
I observed three things:
if the absolute path of the file starts with /storage/emulated/0/ it doesn't mean it'll be on your sdcard - it could be on your main storage instead.
if you wait around 5 minutes, the files do begin to show over USB (i.e. Windows explorer and built-in file explorer)
if you use adb shell ls /sdcard from terminal, then the file does show! you could use adb pull ... to get the file immediately. You could probably use DDMS too.
Code I used was:
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(myArrayList);
try {
File externalDir = getExternalStorageDirectory();
File newFile = new File(externalDir, "myfile.txt");
FileOutputStream os = new FileOutputStream(newFile);
os.write(json.getBytes());
os.flush();
os.close();
Timber.i("saved file to %s",newFile.getAbsoluteFile().toString());
}catch (Exception ex)
{
Toast.makeText(getApplicationContext(), "Save to private external storage failed. Error message is " + ex.getMessage(), Toast.LENGTH_LONG).show();
}
and
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(myArrayList);
try {
File externalDir = getExternalStorageDirectory();
File newFile = new File(externalDir, "myfile.txt");
FileWriter fw = new FileWriter(newFile);
fw.write(json);
fw.flush();
fw.close();
Timber.i("saved file to %s",newFile.getAbsoluteFile().toString());
}catch (Exception ex)
{
Toast.makeText(getApplicationContext(), "Save to private external storage failed. Error message is " + ex.getMessage(), Toast.LENGTH_LONG).show();
}
why is it like this? Seems like another one of those "Android-isms" that you have to suffer through the first time you experience it.

Categories

Resources