如何使其他应用播放/暂停音乐?

时间:2019-02-20 17:19:37

标签: android android-mediaplayer

我正在制作类似于google制作的示例的媒体控制器应用程序。 https://github.com/googlesamples/android-media-controller 但是,我想创建一个可以恢复播放音乐或暂停给定程序包名称的功能。我设法返回了软件包名称列表。 PS。我正在使用本机反应,这就是为什么我需要可以从反应端调用的功能。

    public void getMediaApps (Callback callback) {
        // = getPackageManager();
        ArrayList<MediaAppDetails> mediaApps = new ArrayList<MediaAppDetails>();
        Intent mediaBrowserIntent = new Intent(MediaBrowserServiceCompat.SERVICE_INTERFACE);
        List<ResolveInfo> services = packageManager.queryIntentServices(
                    mediaBrowserIntent,
                    PackageManager.GET_RESOLVED_FILTER
            );
        if (services != null && !services.isEmpty()) {
            for (ResolveInfo info : services) {
                mediaApps.add(
                    new MediaAppDetails(info.serviceInfo, packageManager, resources)
                );
            }
        }
        WritableArray waPackagenames = Arguments.createArray();
        // ArrayList<String> packagenames = ArrayList<String>() 
        if(mediaApps != null && !mediaApps.isEmpty()){
            for(MediaAppDetails mediaApp : mediaApps){
                waPackagenames.pushString(mediaApp.packageName);
            }
        }
        callback.invoke(waPackagenames);
    }

我已经尝试了3天,但是没有运气。 大概不会有什么不同,但这就是我到目前为止使用play功能的地方。

@ReactMethod
    public void play (String packageName) {
        PackageManager pm = this.packageManager;
        Resources res = this.resources;
        ServiceInfo serviceInfo = MediaAppDetails.findServiceInfo(packageName, pm);
        mMediaAppDetails = new MediaAppDetails(serviceInfo, pm, res);
        MediaSessionCompat.Token token = mMediaAppDetails.sessionToken;        
        if (token == null) {
            if (mMediaAppDetails.componentName != null) {
                mBrowser = new MediaBrowserCompat(this.reactContext, mMediaAppDetails.componentName,
                        new MediaBrowserCompat.ConnectionCallback() {
                            @Override
                            public void onConnected() {
                                setupMediaController();
                                // mBrowseMediaItemsAdapter.setRoot(mBrowser.getRoot());
                            }

                            @Override
                            public void onConnectionSuspended() {
                                //TODO(rasekh): shut down browser.
                                // mBrowseMediaItemsAdapter.setRoot(null);
                            }

                            @Override
                            public void onConnectionFailed() {

                                showToastAndFinish("connection failed .. shit!");
                            }

                        }, null);
                        mBrowser.connect();
            } else if (mMediaAppDetails.sessionToken != null) {
                setupMediaController();
            }
            token = mBrowser.getSessionToken();
            Toast.makeText(this.reactContext, "no token can't open controller", Toast.LENGTH_SHORT).show();
            // toast
        }
        // Toast.makeText(this.reactContext, "found token", Toast.LENGTH_SHORT).show();
        if(mBrowser == null )mBrowser = new MediaBrowserCompat(this.reactContext, new ComponentName(packageName, "MainActivity"), null, null);
        MediaControllerCompat.TransportControls transportControls;
        try{
            mController = new MediaControllerCompat(this.reactContext, token);
            if(mController!= null) {
                transportControls = mController.getTransportControls();
                transportControls.play();
            }
        }catch(Exception E){
            Log.w("Error",E);
            Log.w("Error","couldn't create mediaControllerCompat");
            // System.out.println(E);
            // System.out.println("couldn't create mediaControllerCompat");
        }

    }

0 个答案:

没有答案