From 48326940f48390e79476e5ce7c2a18b8201cdafc Mon Sep 17 00:00:00 2001 From: Andy McFadden Date: Fri, 23 Aug 2013 13:49:38 -0700 Subject: Notify the media scanner Use an "am broadcast" command to notify the media scanner that a new video file is available. Bug 10096103 Change-Id: I8261d81d96832969ebb9031a9766c1b1f2a569ed --- cmds/screenrecord/screenrecord.cpp | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) (limited to 'cmds') diff --git a/cmds/screenrecord/screenrecord.cpp b/cmds/screenrecord/screenrecord.cpp index 3f8567c..ceda908 100644 --- a/cmds/screenrecord/screenrecord.cpp +++ b/cmds/screenrecord/screenrecord.cpp @@ -35,6 +35,8 @@ #include #include +#include +#include #include #include #include @@ -138,7 +140,7 @@ static status_t prepareEncoder(float displayFps, sp* pCodec, format->setFloat("frame-rate", displayFps); format->setInt32("i-frame-interval", 10); - /// MediaCodec + // MediaCodec sp looper = new ALooper; looper->setName("screenrecord_looper"); looper->start(); @@ -370,10 +372,15 @@ static status_t runEncoder(const sp& encoder, if (err != NO_ERROR) { fprintf(stderr, "Unable to get new output buffers (err=%d)\n", err); + return err; } break; + case INVALID_OPERATION: + fprintf(stderr, "Request for encoder buffer failed\n"); + return err; default: - ALOGW("Got weird result %d from dequeueOutputBuffer", err); + fprintf(stderr, + "Got weird result %d from dequeueOutputBuffer\n", err); return err; } } @@ -477,6 +484,29 @@ static status_t recordScreen(const char* fileName) { } /* + * Sends a broadcast to the media scanner to tell it about the new video. + */ +static status_t notifyMediaScanner(const char* fileName) { + String8 command("am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file://"); + command.append(fileName); + if (gVerbose) { + printf("Shell: %s\n", command.string()); + } + + // TODO: for non-verbose mode we should suppress stdout + int status = system(command.string()); + if (status < 0) { + fprintf(stderr, "Unable to fork shell for media scanner broadcast\n"); + return UNKNOWN_ERROR; + } else if (status != 0) { + fprintf(stderr, "am command failed (status=%d): '%s'\n", + status, command.string()); + return UNKNOWN_ERROR; + } + return NO_ERROR; +} + +/* * Parses a string of the form "1280x720". * * Returns true on success. @@ -609,6 +639,10 @@ int main(int argc, char* const argv[]) { close(fd); status_t err = recordScreen(fileName); + if (err == NO_ERROR) { + // Try to notify the media scanner. Not fatal if this fails. + notifyMediaScanner(fileName); + } ALOGD(err == NO_ERROR ? "success" : "failed"); return (int) err; } -- cgit v1.1