I have an app that records audio and writes it into a file in the app's own
internal storage directory, but it's generating a denial message in dmesg.
<5>[ 764.181424] type=1400 audit(1353954893.125:9): avc: denied { write }
for pid=1453 comm="IntentService[R" path="/data/data/org.testapp
/files/1353954893122.3gp" dev=mmcblk0p2 ino=49443 scontext=u:r:mediaserver:s0
tcontext=u:object_r:app_data_file:s0:c45,c256 tclass=file
Fixed by adding
allow mediaserver app_data_file:file write;
to mediaserver.te which is hopefully safe and appropriate to do? (I'm new here)
I believe the application itself opens the file, then passes the file
descriptor to the mediaserver and the mediaserver writes to it.
(Relevant AOSP code is in
frameworks/base/media/java/android/media/MediaRecorder.java)
Some of my application code (can provide more if helpful):
MediaRecorder mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
String fileName = System.currentTimeMillis() + ".3gp";
try {
mRecorder.setOutputFile(openFileOutput(fileName,
MODE_PRIVATE).getFD());
}
setOutputFile can also be called with a String (path to the file) rather than
called with a file descriptor, but I think (from a quick glance at the code) in
that case the MediaRecorder code still has the application open the file and
pass the file descriptor to the mediaserver.
Thanks,
Mike