За и против MPMoviePlayerController по сравнению с запуском UIWebView для потоковой передачи фильма

В этих случаях вам нужно обрабатывать разъединение вручную. Я имею в виду, что вы должны перехватывать любое разъединение, прослушиватель соединений уведомляет вас, когда вы разорвали соединение.

public void connectionClosedOnError (Исключение исключения)

    import android.util.Log;

    import com.dagm8.core.protocols.ConnectionState;
    import com.dagm8.core.service.XMPPService;
    import com.dagm8.events.ConnectionStateEvent;

    import org.greenrobot.eventbus.EventBus;
    import org.jivesoftware.smack.ConnectionListener;
    import org.jivesoftware.smack.SmackException;
    import org.jivesoftware.smack.XMPPConnection;
    import org.jivesoftware.smack.XMPPException;
    import org.jivesoftware.smack.tcp.XMPPTCPConnection;

    import java.io.IOException;

    import static com.dagm8.core.protocols.ConnectionState.CONNECTED;
    import static com.dagm8.core.protocols.ConnectionState.DISCONNECTED;
    import static com.dagm8.core.protocols.ConnectionState.RECONNECTING;

    /**
     * dagm8-android
     * Created by Bedoy on 8/28/17.
     */

    public class ConnectionController implements ConnectionListener {

        private String TAG = getClass().getCanonicalName();

        private XMPPTCPConnection mConnection;

        public void setConnection(XMPPTCPConnection connection) {
            mConnection = connection;
        }

        public void init(XMPPTCPConnection connection) throws InterruptedException, XMPPException, SmackException, IOException {

            setConnection(connection);

            mConnection.setPacketReplyTimeout(10000);
            mConnection.addConnectionListener(this);
            mConnection.connect();
        }

        @Override
        public void connected(XMPPConnection connection) {
            XMPPService.connectionState = RECONNECTING;

            notifyConnectionState(RECONNECTING);

            try {
                mConnection.login();
            } catch (XMPPException | SmackException | IOException | InterruptedException e) {
                e.printStackTrace();
            }

            Log.i(TAG, "connected()");
        }


        @Override
        public void authenticated(XMPPConnection connection, boolean resumed) {
            XMPPService.connectionState = CONNECTED;

            notifyConnectionState(CONNECTED);

            Log.i(TAG, "authenticated()");
        }

        @Override
        public void connectionClosed() {
            XMPPService.connectionState = DISCONNECTED;

            notifyConnectionState(DISCONNECTED);

            Log.i(TAG, "connectionClosed()");
        }

        @Override
        public void connectionClosedOnError(Exception e) {
            XMPPService.connectionState = DISCONNECTED;

            notifyConnectionState(DISCONNECTED);


            try {
                mConnection.connect();
            } catch (SmackException | IOException | XMPPException | InterruptedException exception) {
                exception.printStackTrace();
            }
            Log.i(TAG, "connectionClosedOnError()");
        }

        @Override
        public void reconnectingIn(int seconds) {
            XMPPService.connectionState = RECONNECTING;

            notifyConnectionState(RECONNECTING);

            Log.i(TAG, "reconnectingIn()");
        }

        @Override
        public void reconnectionSuccessful() {
            XMPPService.connectionState = CONNECTED;

            notifyConnectionState(CONNECTED);

            Log.i(TAG, "reconnectionSuccessful()");
        }

        @Override
        public void reconnectionFailed(Exception e) {
            XMPPService.connectionState = DISCONNECTED;

            notifyConnectionState(DISCONNECTED);

            Log.i(TAG, "reconnectionFailed()");
        }


        private void notifyConnectionState(ConnectionState state) {
            EventBus.getDefault().post((ConnectionStateEvent) () -> state);
        }

        public boolean isAuthenticated()
        {
            return mConnection.isAuthenticated();
        }

        public void login() {
            try {
                mConnection.login();
            } catch (XMPPException | SmackException | IOException | InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
19
задан Nosredna 10 June 2009 в 16:42
поделиться

2 ответа

UIWebView не может воспроизводить видео. Переход на страницу Youtube с помощью UIWebview просто запустит приложение Youtube на iPhone. Выполнение этого определенного способа вернет управление вашему приложению после воспроизведения видео. См. Здесь: http://iphoneincubator.com/blog/tag/uiwebview

Я бы рекомендовал использовать MPMoviePlayer Controller, если вы выполняете только простую потоковую передачу. Вот пример кода, который поможет вам начать:

NSString *url = @"http://www.example.com/path/to/movie.mp4";
MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc]
                                        initWithContentURL:[NSURL URLWithString:url]];
[moviePlayer play];
9
ответ дан 30 November 2019 в 03:48
поделиться

РЕДАКТИРОВАТЬ: Мой исходный пример в этом ответе инициализирован веб-просмотр с рамкой CGRectZero. Это работало до iOS 3.2. Начиная с iOS 4, веб-просмотр должен иметь ненулевой кадр, иначе видео не будет воспроизводиться. Я отредактировал свой пример ниже, чтобы отразить это изменение.


Принятый здесь ответ неверен. Фактически вы можете использовать UIWebView для потоковой передачи видео, и в некотором смысле это лучше, чем MPMoviePlayerController. Если вы укажете UIWebView запросить видеофайл (например, mp4) через loadRequest :, он откроет новое окно и потоковое видео в вашем приложении. В отличие от MPMoviePlayerController, видеоокно, созданное UIWebView, можно повернуть в альбомную или портретную ориентацию. Когда видео закончится, пользователь может закрыть это окно и вернуться в ваше приложение.


РЕДАКТИРОВАТЬ 2: Поскольку теперь вы можете реализовать видеопроигрыватель, который вращается с помощью MPMoviePlayerViewController, я больше не могу думать о причине использования UIWebView для видео с использованием метод, описанный в этом ответе.


Подсказка: поскольку UIWebView создает собственное окно для воспроизведения видео, вам даже не нужно добавлять UIWebView в иерархию представлений. Вы можете просто создать объект UIWebView и вызвать loadRequest: для воспроизведения видео, никогда не передавая объект в addSubview:.

self.webView = [[[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] autorelease];
NSURL *url = [NSURL URLWithString:@"http://www.jonathancoulton.com/music/thingaweek/CodeMonkey.mp3"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];
25
ответ дан 30 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: