AllShare Cast / Screen Cast 在某些手机上无法工作

5
我访问了三星网站并下载了媒体控制SDK包。当我在我的Galaxy S3 Android 4.3上使用AllShare Cast视频播放器时,我的智能电视(在同一网络中)显示在AllShare Cast列表中。
然而,在我使用相同的应用程序在我的已root的Galaxy Note 2 Android 4.1.1上时,我的智能电视(在同一网络中)没有出现在AllShare Cast列表中。
代码:
public class DevicePicker extends Fragment implements OnClickListener,SmcDeviceFinder.StatusListener, SmcDeviceFinder.DeviceListener {


    public interface DevicePickerResult {

        void onDeviceSelected(SmcDevice device);

        /**
         * User clicked to disable AllShare
         */
        void onAllShareDisabled();
    }

    /**
     * The type of device we are interested in
     */
    private int mType = SmcDevice.TYPE_AVPLAYER;

    /**
     * Listener to be notified of events
     */
    private DevicePickerResult mPickerListener;

    /**
     * Device finder instance
     */
    private SmcDeviceFinder smcDeviceFinder;

    /**
     * The ImageView displaying AllShare icon
     */
    private ImageView mIcon;

    /**
     * Flag indicating if AllShare is currently active
     */
    private boolean mActive;

    private String mDeviceId;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        // Set view, remember ImageView for icon and setup onclick listener.
        View v = inflater.inflate(R.layout.device_picker, container, false);
        mIcon = (ImageView) v.findViewById(R.id.devicePickerIcon);
        mIcon.setOnClickListener(this);
        return v;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        /*
        if(savedInstanceState!=null){
            mDeviceId = savedInstanceState.getString("deviceId");
        }
        */
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

    }

    public void setDeviceType(int type) {
        mType = type;
    }

    public void setDeviceSelectedListener(DevicePickerResult listener) {
        mPickerListener = listener;
        restoreDevice();
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // The service provider needs to be created after device type is set
        // It could also be created in onStart or onResume, but we the sooner
        // we create it, the sooner we get devices.
        SmcDeviceFinder df = new SmcDeviceFinder(getActivity());
        df.setStatusListener(this);
        df.start();

    }


    private void restoreDevice(){
        if(smcDeviceFinder != null && mDeviceId!=null && mPickerListener != null) {
            SmcDevice SmcDevice_ = smcDeviceFinder.getDevice(mType, mDeviceId);
            if(SmcDevice_!=null){
                mPickerListener.onDeviceSelected(SmcDevice_);
                setActive(true);
            }
        }
    }

    public void setActive(boolean newState) {
        if (newState == mActive) {
            // No change in state, do nothing
            return;
        }
        mActive = newState;
        mIcon.setImageResource(
                newState ?
                        R.drawable.allshare_icons_active :
                        R.drawable.allshare_icons_inactive);
        updateButtonCounter();
    }

    @Override
    public void onClick(View v) {
        if (v != mIcon) {
            return;
        }

        if(smcDeviceFinder != null) {

            int numDevices = smcDeviceFinder.getDeviceList(mType).size();

            // If no devices found, try refreshing the list.
            if (numDevices == 0) {
                smcDeviceFinder.rescan();
            }

            // If we are already active, disable allshare
            if (mActive) {
                setActive(false);
                if (mPickerListener != null) {
                    mPickerListener.onAllShareDisabled();
                }
                return;
            }
        }

        // Devices are available, and we are not connected
        // Ask user to select device
        showPickerDialog();
    }

    @Override
    public void onDetach() {
        if (smcDeviceFinder != null) {
            smcDeviceFinder.stop();
            smcDeviceFinder = null;
        }
        super.onDetach();
    }

    ///////////////////////////////////////////////////////////////////////////
    // These methods handle device finder start hide event.
    ///////////////////////////////////////////////////////////////////////////

    @Override
    public void onStarted(SmcDeviceFinder deviceFinder, int error) {
        if (error == Smc.SUCCESS) {
            smcDeviceFinder = deviceFinder;
            smcDeviceFinder.setDeviceListener(mType, this);
            smcDeviceFinder.rescan();
            updateButtonCounter();
            restoreDevice();
        }
    }

    @Override
    public void onStopped(SmcDeviceFinder deviceFinder) {
        if (smcDeviceFinder == deviceFinder) {
            smcDeviceFinder.setDeviceListener(mType, null);
            smcDeviceFinder.setStatusListener(null);
            smcDeviceFinder = null;
        }
    }

    ///////////////////////////////////////////////////////////////////////////
    // These methods handle devices appearing and disappearing in network.
    ///////////////////////////////////////////////////////////////////////////

    @Override
    public void onDeviceAdded(SmcDeviceFinder deviceFinder, SmcDevice smcDevice) {
        // We aren't interested in individual devices, only in their number
        updateButtonCounter();
    }

    @Override
    public void onDeviceRemoved(SmcDeviceFinder deviceFinder, SmcDevice smcDevice, int error) {
        // We aren't interested in individual devices, only in their number
        updateButtonCounter();
        //if current device has been removed
        if (smcDevice.getId().equals(mDeviceId)) {
            setActive(false);
            if (mPickerListener != null) {
                mPickerListener.onAllShareDisabled();
            }
        }
    }



    /**
     * Methods that selects which icon to display, based on number of
     * available devices in network.
     */
    private void updateButtonCounter() {
        if (smcDeviceFinder != null) {
            int numDevices =
                smcDeviceFinder.getDeviceList(mType).size();

            mIcon.getDrawable().setLevel(numDevices);
            if (numDevices==0) {
                setActive(false);
            }
        }
    }

    public void showPickerDialog() {
        Intent intent = new Intent(getActivity(), DeviceSelectActivity.class);
        intent.putExtra("deviceType", mType);
        startActivityForResult(intent, 0);
    }

    /**
     * Callback when user has selected device in device select activity.
     */
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK) {
            mDeviceId = data.getStringExtra("deviceId");
            int type = data.getIntExtra("deviceType", -1);

            if (smcDeviceFinder != null && mPickerListener != null) {
                SmcDevice device = smcDeviceFinder.getDevice(type, mDeviceId);
                if(device!=null){
                    mPickerListener.onDeviceSelected(device);
                    setActive(true);
                }
            }
        }
    }
}

WiFi已打开。

有人可以帮助我吗?

有些应用甚至可以看到我的Apple TV设备(但是我的应用在AllShare Cast列表上无法看到此Apple TV设备)。

非常感谢您。

1个回答

0
如果我没记错的话,AllShare投屏是基于Miracast构建的。该功能已经在Android 4.2中针对具有必要硬件支持的设备进行了包括,这也可以解释为什么你的Note 2运行4.1.1存在问题。

谢谢您的评论,但那不是真的。他们的网站上写着:“Android 4.0冰淇淋三明治(API级别14)或更高版本的设备。”链接:http://developer.samsung.com/galaxy#media-control 非常感谢。 - IYM-14
既然你提到了Miracast支持,我认为AllShare dongle/设备已经通过软件更新添加了这个功能。不过三星真的没有让Note 2升级到超过4.1.1吗? - blunden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接