Revert "Delete code used to read content:// URIs from MediaPlayerService"
This reverts commit fa2219509c820a0a274542b9c8a35257da627208.
Reason for revert: Moves failure on bad URIs from setDataSource to prepare, b/279586249
Change-Id: I6f04e387027f229e4e9a4c0a09e9acae9935f6bf
diff --git a/media/libmediaplayerservice/ActivityManager.cpp b/media/libmediaplayerservice/ActivityManager.cpp
new file mode 100644
index 0000000..438d422
--- /dev/null
+++ b/media/libmediaplayerservice/ActivityManager.cpp
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <binder/IActivityManager.h>
+#include <binder/IBinder.h>
+#include <binder/IServiceManager.h>
+
+#include "ActivityManager.h"
+
+namespace android {
+
+// Perform ContentProvider.openFile() on the given URI, returning
+// the resulting native file descriptor. Returns < 0 on error.
+int openContentProviderFile(const String16& uri)
+{
+ int fd = -1;
+
+ sp<IServiceManager> sm = defaultServiceManager();
+ sp<IBinder> binder = sm->getService(String16("activity"));
+ sp<IActivityManager> am = interface_cast<IActivityManager>(binder);
+ if (am != NULL) {
+ fd = am->openContentUri(uri);
+ }
+
+ return fd;
+}
+
+} /* namespace android */
diff --git a/media/libmediaplayerservice/ActivityManager.h b/media/libmediaplayerservice/ActivityManager.h
new file mode 100644
index 0000000..451a004
--- /dev/null
+++ b/media/libmediaplayerservice/ActivityManager.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ActivityManager_H
+#define ActivityManager_H
+
+#include <utils/String16.h>
+
+namespace android {
+
+// Perform a ContentProvider.openFile() call for the given URI.
+//
+// Returns the native file descriptor for the opened stream, < 0 on error.
+extern int openContentProviderFile(const String16& uri);
+
+}
+
+#endif
diff --git a/media/libmediaplayerservice/Android.bp b/media/libmediaplayerservice/Android.bp
index 6ddaf25..266cb17 100644
--- a/media/libmediaplayerservice/Android.bp
+++ b/media/libmediaplayerservice/Android.bp
@@ -20,6 +20,7 @@
cc_library {
srcs: [
+ "ActivityManager.cpp",
"DeathNotifier.cpp",
"MediaPlayerFactory.cpp",
"MediaPlayerService.cpp",
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 65381c4..9e9e9d8 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -75,6 +75,7 @@
#include <private/android_filesystem_config.h>
+#include "ActivityManager.h"
#include "MediaRecorderClient.h"
#include "MediaPlayerService.h"
#include "MetadataRetrieverClient.h"
@@ -1001,13 +1002,31 @@
}
}
- player_type playerType = MediaPlayerFactory::getPlayerType(this, url);
- sp<MediaPlayerBase> p = setDataSource_pre(playerType);
- if (p == NULL) {
- return NO_INIT;
- }
+ if (strncmp(url, "content://", 10) == 0) {
+ // get a filedescriptor for the content Uri and
+ // pass it to the setDataSource(fd) method
- return mStatus = setDataSource_post(p, p->setDataSource(httpService, url, headers));
+ String16 url16(url);
+ int fd = android::openContentProviderFile(url16);
+ if (fd < 0)
+ {
+ ALOGE("Couldn't open fd for %s", url);
+ return UNKNOWN_ERROR;
+ }
+ status_t status = setDataSource(fd, 0, 0x7fffffffffLL); // this sets mStatus
+ close(fd);
+ return mStatus = status;
+ } else {
+ player_type playerType = MediaPlayerFactory::getPlayerType(this, url);
+ sp<MediaPlayerBase> p = setDataSource_pre(playerType);
+ if (p == NULL) {
+ return NO_INIT;
+ }
+
+ return mStatus =
+ setDataSource_post(
+ p, p->setDataSource(httpService, url, headers));
+ }
}
status_t MediaPlayerService::Client::setDataSource(int fd, int64_t offset, int64_t length)