YouTube Player не воспроизводится при повороте устройства

Я использую API YouTube в своем приложении для Android. Все инициализируется довольно хорошо, и видео воспроизводится при нажатии, но когда я выбираю воспроизведение видео в полноэкранном режиме, он просто заставляет телефон вращаться и воспроизводит видео в течение 1 с, а затем останавливается. Когда я пытаюсь воспроизвести видео еще раз, оно повторяет одно и то же действие: воспроизводится в течение 1 секунды, а затем останавливается. Буду признателен за любую помощь в исправлении этой ошибки. У меня есть мысль, что со слушателями что-то не так, но решения я не придумал. Я публикую код ниже (в основном, фрагменты, которые связаны с проигрывателем YouTube...) Если вам нужны какие-либо подробности, вы можете спросить...

public class ItemScreen extends ActionBarActivity implements BaseSliderView.OnSliderClickListener, YouTubePlayer.OnInitializedListener {

public String VIDEO_ID;
private SliderLayout mDemoSlider;
private ClickableItem ci;
private RatingBar rb;
private SharedPreferences sp;
private String location;
private int position;
private TextView rating_text;
private double votes, voters;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.item_screen);
    //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    mDemoSlider = (SliderLayout) findViewById(R.id.slider);
    TextView work_hours = (TextView) findViewById(R.id.work_hours);
    TextView address = (TextView) findViewById(R.id.address);
    TextView description = (TextView) findViewById(R.id.description);
    rating_text = (TextView) findViewById(R.id.rating_text);
    ImageButton pin = (ImageButton) findViewById(R.id.pin);
    final ImageButton number = (ImageButton) findViewById(R.id.number);
    final ImageButton email = (ImageButton) findViewById(R.id.email);
    rb = (RatingBar) findViewById(R.id.ratingBar);
    View divider = (View) findViewById(R.id.divider4);
    View otherDivider = (View) findViewById(R.id.divider3);

    FrameLayout frameLayout = (FrameLayout) findViewById(R.id.frame_layout);
    //YouTubePlayerSupportFragment youTubePlayerFragment = (YouTubePlayerSupportFragment) getSupportFragmentManager().findFragmentById(R.id.youtube_fragment);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    Intent i = getIntent();
    position = i.getIntExtra("position", 0);
    location = i.getStringExtra("location");
    if (location.equals("events")) {
        number.setVisibility(View.GONE);
        email.setVisibility(View.GONE);
    }
    if (location.equals("events") || location.equals("cinema")) {
        rb.setVisibility(View.GONE);
        divider.setVisibility(View.GONE);
    }

    ci = new ClickableItem();
    DatabaseHandler db = new DatabaseHandler(this);
    ci = db.getAllClickableItems(location).get(position);
    db.closeDB();
    getSupportActionBar().setTitle(ci.getName());

    if (location.equals("cinema")) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager
                .beginTransaction();

        YouTubePlayerSupportFragment fragment = new YouTubePlayerSupportFragment();
        fragmentTransaction.add(R.id.frame_layout, fragment);
        fragmentTransaction.commit();
        fragment.initialize(DeveloperKey.DEVELOPER_KEY, this);
        VIDEO_ID = ci.getTrailer();
        VIDEO_ID = getYoutubeVideoId(VIDEO_ID);
    } else {
        frameLayout.setVisibility(View.GONE);
        //otherDivider.
    }

    work_hours.setText(ci.getWork_hours());
    address.setText(ci.getAddress());
    description.setText(ci.getDescription());
    String foto_links = ci.getFoto_links();
    HashMap<String, String> url_maps = new HashMap<String, String>();
    String url, name_foto = ci.getName();
    int pos;
    if (!foto_links.contains(","))
        url_maps.put(name_foto, encode_url(foto_links, location));
    else
        while (!foto_links.equals("")) {
            pos = foto_links.indexOf(',');
            url = foto_links.substring(0, pos);
            url_maps.put(name_foto, encode_url(url, location));
            foto_links = foto_links.replace(url, "");
            foto_links = foto_links.substring(1);
            name_foto += " ";
            if (!foto_links.contains(",")) {
                url_maps.put(name_foto, encode_url(foto_links, location));
                break;
            }
        }

    for (String name : url_maps.keySet()) {
        TextSliderView textSliderView = new TextSliderView(this);
        textSliderView
                .description(name)
                .image(url_maps.get(name))
                .setScaleType(BaseSliderView.ScaleType.Fit)
                .setOnSliderClickListener(this);
        textSliderView.getBundle()
                .putString("extra", name);
        mDemoSlider.addSlider(textSliderView);
    }
    mDemoSlider.setPresetTransformer(SliderLayout.Transformer.Default);
    mDemoSlider.setPresetIndicator(SliderLayout.PresetIndicators.Center_Top);
    mDemoSlider.setCustomAnimation(new DescriptionAnimation());
    mDemoSlider.setDuration(4000);
    sp = getSharedPreferences("MyPrefs", MODE_PRIVATE);
    if (!sp.getBoolean(ci.getName(), true)) {
        rb.setRating(sp.getFloat(ci.getName() + " ", 0));
        votes = ci.getVotes() + Math.round(sp.getFloat(ci.getName() + " ", 0));
        voters = ci.getVoters() + 1;
        rating_text.setText("Dabartinis reitingas: " + String.format("%2.02f", votes / voters));
    } else if (ci.getVoters() != 0) {
        votes = ci.getVotes();
        voters = ci.getVoters();
        rating_text.setText("Dabartinis reitingas: " + String.format("%2.02f", votes / voters));
    } else {
        voters = votes = 0;
    }

    rb.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
        @Override
        public void onRatingChanged(RatingBar ratingBar, final float rating, boolean fromUser) {
            if (rating != 0)
                if (sp.getBoolean(ci.getName(), true)) {
                    if (checkInternetConnection()) {
                        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
                        StringRequest postRequest = new StringRequest(Request.Method.POST, "SERVER",
                                new Response.Listener<String>() {
                                    @Override
                                    public void onResponse(String response) {
                                    }
                                },
                                new Response.ErrorListener() {
                                    @Override
                                    public void onErrorResponse(VolleyError error) {
                                        Log.d("Error.Response", error.toString());
                                    }
                                }
                        ) {
                            @Override
                            protected Map<String, String> getParams() {
                                Map<String, String> params = new HashMap<String, String>();
                                params.put("table", location);
                                params.put("name", ci.getName());
                                params.put("vote", String.valueOf(Math.round(rating)));
                                return params;
                            }
                        };
                        queue.add(postRequest);
                        Toast.makeText(getApplicationContext(), "Tavo balsas išsiųstas!", Toast.LENGTH_SHORT).show();
                        SharedPreferences.Editor editor = sp.edit();
                        editor.putBoolean(ci.getName(), false);
                        editor.putFloat(ci.getName() + " ", rating);
                        editor.commit();
                        votes = ci.getVotes() + rating;
                        voters = ci.getVoters() + 1;
                        rating_text.setText("Dabartinis reitingas: " + String.format("%2.02f", votes / voters));
                    } else {
                        rb.setRating(0);
                    }
                } else {
                    rb.setRating(sp.getFloat(ci.getName() + " ", 0));
                    Toast.makeText(getApplicationContext(), "Tu jau balsavai už šią vietą!", Toast.LENGTH_SHORT).show();
                }
        }
    });

    number.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //number.setImageResource(R.drawable.telefonas_clicked);
            Intent callIntent = new Intent(Intent.ACTION_CALL);
            callIntent.setData(Uri.parse("tel:" + ci.getNumber()));
            startActivity(callIntent);
        }
    });
    email.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //email.setImageResource(R.drawable.laiskas_clicked);
            Intent email = new Intent(Intent.ACTION_SEND);
            email.putExtra(Intent.EXTRA_EMAIL, new String[]{ci.getEmail()});
            email.putExtra(Intent.EXTRA_SUBJECT, "Aš naudojuosi Miesto Meniu!");
            email.setType("message/rfc822");
            startActivity(Intent.createChooser(email, "Pasirinkite programėlę"));

        }
    });
    pin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(getApplicationContext(), Maps.class);
            i.putExtra("location", location);
            i.putExtra("position", position);
            i.putExtra("one", true);
            startActivity(i);
        }
    });
}

@Override
public void onSliderClick(BaseSliderView slider) {
}

private String encode_url(String url, String loc) {
    Log.d("url tikras: ", url);
    String nereikalinga = url.split("/")[url.split("/").length - 1];
    Log.d("nereikalinga: ", nereikalinga);
    try {
        Log.d("toks url: ", url.replace(nereikalinga, (URLEncoder.encode(nereikalinga, "UTF-8"))));
        if (!loc.equals("events"))
            return url.replace(nereikalinga, (URLEncoder.encode(nereikalinga, "UTF-8")));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return url;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.menu.item_screen, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
        case R.id.share:
            Intent emailIntent = new Intent(Intent.ACTION_SEND);
            emailIntent.setData(Uri.parse("mailto:"));
            emailIntent.setType("text/plain");
            emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Aš naudojuosi Miesto Meniu!");
            emailIntent.putExtra(Intent.EXTRA_TEXT, ci.getName() + "\n" + "\n" +
                    ci.getAddress() + "\n" + "\n" + ci.getWork_hours() + "\n" + "\n" +
                    ci.getDescription() + "\n" + "\n" + ci.getNumber() + "\n" + "\n" +
                    ci.getEmail());
            try {
                startActivity(Intent.createChooser(emailIntent, "Pasirinkite programėlę"));
            } catch (android.content.ActivityNotFoundException ex) {
                Toast.makeText(ItemScreen.this,
                        "Klaida!", Toast.LENGTH_SHORT).show();
            }
            break;
    }
    return super.onOptionsItemSelected(item);
}

private boolean checkInternetConnection() {
    ConnectionDetector cd = new ConnectionDetector(this);
    Boolean isInternetPresent = cd.isConnectingToInternet();
    if (!isInternetPresent) {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder
                .setTitle("Nėra interneto ryšio!")
                .setMessage("Programėlei reikalingas interneto ryšys, norint balsuoti")
                .setCancelable(false)
                .setPositiveButton("Gerai", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        //rb.setActivated(false);
                    }
                });
        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
        return false;
    }
    return true;
}

@Override
public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult result) {
    Toast.makeText(this, "Klaida!", Toast.LENGTH_LONG).show();
}


@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) {

    player.setPlayerStateChangeListener(playerStateChangeListener);
    player.setPlaybackEventListener(playbackEventListener);

    if (!wasRestored) {
        player.cueVideo(VIDEO_ID);
    }
}

private YouTubePlayer.PlaybackEventListener playbackEventListener = new YouTubePlayer.PlaybackEventListener() {

    @Override
    public void onBuffering(boolean arg0) {

    }

    @Override
    public void onPaused() {

    }

    @Override
    public void onPlaying() {

    }

    @Override
    public void onSeekTo(int arg0) {

    }

    @Override
    public void onStopped() {

    }

};

private YouTubePlayer.PlayerStateChangeListener playerStateChangeListener = new YouTubePlayer.PlayerStateChangeListener() {

    @Override
    public void onAdStarted() {

    }

    @Override
    public void onError(YouTubePlayer.ErrorReason arg0) {

    }

    @Override
    public void onLoaded(String arg0) {

    }

    @Override
    public void onLoading() {
    }

    @Override
    public void onVideoEnded() {

    }

    @Override
    public void onVideoStarted() {

    }
};

//@Override

protected YouTubePlayer.Provider getYouTubePlayerProvider() {
    return (YouTubePlayerSupportFragment) getSupportFragmentManager().findFragmentById(R.id.youtube_fragment);
}

public static String getYoutubeVideoId(String youtubeUrl) {
    String video_id = "";
    if (youtubeUrl != null && youtubeUrl.trim().length() > 0 && youtubeUrl.startsWith("http")) {

        String expression = "^.*((youtu.be" + "\\/)" + "|(v\\/)|(\\/u\\/w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#\\&\\?]*).*"; // var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
        CharSequence input = youtubeUrl;
        Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(input);
        if (matcher.matches()) {
            String groupIndex1 = matcher.group(7);
            if (groupIndex1 != null && groupIndex1.length() == 11)
                video_id = groupIndex1;
        }
    }
    return video_id;
}
}

Этот макет класса

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
tools:context="com.daimajia.slider.demo.MainActivity">

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:fillViewport="true"
    android:background="@drawable/background">

    <!--android:margin="5dp"-->

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:id="@+id/relative_layout"
        android:background="#4D000000">

        <com.daimajia.slider.library.SliderLayout
            android:id="@+id/slider"
            android:layout_width="match_parent"
            custom:pager_animation="Default"
            custom:indicator_visibility="visible"
            custom:pager_animation_span="1100"
            android:layout_height="200dp" />

        <TextView
            android:id="@+id/address"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Konstitucijos pr. 7A, Vilnius"
            android:textColor="#FFFFFF"
            android:layout_below="@+id/slider"
            android:layout_marginTop="15dp" />

        <ImageButton
            android:id="@+id/pin"
            android:layout_width="32dp"
            android:layout_height="32dp"
            android:layout_below="@+id/slider"
            android:layout_alignParentRight="true"
            android:layout_marginRight="5dp"
            android:background="@drawable/pin"
            android:layout_marginTop="5dp" />

        <View
            android:id="@+id/divider1"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#433b39"
            android:layout_below="@id/address"
            android:layout_marginTop="10dp" />

        <TextView
            android:id="@+id/work_hours"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/divider1"
            android:text="I - VI 10:00 - 21:00, VII 10:00 - 20:00"
            android:textColor="#FFFFFF"
            android:layout_marginTop="10dp" />

        <View
            android:id="@+id/divider2"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#433b39"
            android:layout_below="@id/work_hours"
            android:layout_marginTop="10dp" />

        <TextView
            android:id="@+id/description"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/divider2"
            android:layout_marginTop="10dp"
            android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
            android:textColor="#FFFFFF" />

        <FrameLayout
            android:id="@+id/frame_layout"
            android:layout_below="@+id/description"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <fragment
                android:name="com.google.android.youtube.player.YouTubePlayerFragment"
                android:id="@+id/youtube_fragment"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </FrameLayout>

        <View
            android:id="@+id/divider3"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#575350"
            android:layout_below="@id/frame_layout"
            android:layout_marginTop="10dp" />

        <RelativeLayout
            android:layout_below="@+id/divider3"
            android:layout_width="match_parent"
            android:id="@+id/rl"
            android:layout_height="wrap_content">

            <RatingBar
                android:id="@+id/ratingBar"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:numStars="5"
                android:stepSize="1.0"
                android:rating="0" />

            <TextView
                android:layout_width="match_parent"
                android:id="@+id/rating_text"
                android:layout_below="@+id/ratingBar"
                android:layout_height="wrap_content"
                android:gravity="center"/>

        </RelativeLayout>

        <View
            android:id="@+id/divider4"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#575350"
            android:layout_below="@id/rl" />

        <LinearLayout
            android:layout_below="@id/divider4"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:orientation="horizontal"
            android:layout_margin="5dp"
            android:clickable="true">

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1.0"
                android:text="" />

            <ImageButton
                android:id="@+id/number"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:background="@drawable/phone" />

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1.0"
                android:text="" />

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1.0"
                android:text="" />

            <ImageButton
                android:id="@+id/email"
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"
                android:background="@drawable/mail" />

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1.0"
                android:text="" />
        </LinearLayout>

    </RelativeLayout>

</ScrollView>

<com.daimajia.slider.library.Indicators.PagerIndicator
    android:id="@+id/custom_indicator2"
    style="@style/AndroidImageSlider_Corner_Oval_Orange"
    android:layout_marginBottom="10dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<com.daimajia.slider.library.Indicators.PagerIndicator
    android:id="@+id/custom_indicator"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    custom:selected_color="#0095BF"
    custom:unselected_color="#55333333"
    custom:shape="oval"
    custom:selected_padding_left="5dp"
    custom:selected_padding_right="5dp"
    custom:unselected_padding_left="5dp"
    custom:unselected_padding_right="5dp"
    custom:selected_width="6dp"
    custom:selected_height="6dp"
    custom:unselected_width="6dp"
    custom:unselected_height="6dp"/>

EDIT: I found out, that it comes with an error in log: 12-04 15:23:33.800 6836-6836 W/YouTubeAndroidPlayerAPI﹕ YouTube video playback stopped due to unauthorized overlay on top of player. The YouTubePlayerView is not contained inside its ancestor android.widget.ScrollView{434fe9e0 VFED.V.. .......D 0,0-1794,861}. The distances between the ancestor's edges and that of the YouTubePlayerView is: left: 15, top: -410, right: 15, bottom: 279 (these should all be positive). The location, in which YouTube player is played, is cinema. I believe, that it's related to setVisibility() properties, in which elements are forced to overlap YouTube fragment.

введите здесь описание изображения


person Sharptax    schedule 04.12.2014    source источник


Ответы (1)


Вы не можете вырезать какую-либо часть изображения на YouTube или делать его чрезмерным. Убедитесь, что размер представления Youtube равен ‹= размеру его контейнера.

person bonnyz    schedule 15.01.2015