ওয়েবভিউ এবং এইচটিএমএল 5 <ভিডিও>


122

আমি একটি সস্তারো অ্যাপ্লিকেশন একসাথে করছি যা আমাদের ওয়েবসাইটের কিছু জিনিস "ফ্রেম" এর মধ্যে রয়েছে ... এর সাথে খুব সহজ WebViewClient । আমি ভিডিও আঘাত পর্যন্ত।

ভিডিওটি HTML5 উপাদান হিসাবে করা হয়েছে, এবং এটি ক্রোম, আইফোনগুলিতে দুর্দান্ত এবং জঘন্য কাজ করে, এবং এখন আমরা যে এনকোডিংয়ের সমস্যাগুলি এটিতে দুর্দান্ত কাজ করে তা স্থির করেছিAndroid নেটিভ ব্রাউজারে ।

এখন ঘষা: WebView লাগে না। মোটেই আমি পোস্টার চিত্রটিতে ক্লিক করতে পারি, এবং কিছুই ঘটে না।

Googling, আমি দেখেছি এই যা ঘনিষ্ঠ, কিন্তু একটি ভিডিও উপাদানের পরিবর্তে একটি 'লিঙ্কটি' (একটি href ... হিসেবে) উপর ভিত্তি করে বলে মনে হয়। (onDownloadListener ভিডিও উপাদানের সাথে জড়িত বলে উপস্থিত হয় না ...)

আমি শো কাস্টমভিউতে ওভাররাইডিংয়ের উল্লেখগুলিও দেখতে পাই, তবে এটি ভিডিও উপাদানগুলিতে কল করা যায় না বলে মনে হয় ... না ওভাররাইড ইউরাললয়েডিং করা উচিত ..

আমি বরং "সার্ভার থেকে এক্সএমএল টানুন, অ্যাপ্লিকেশনটিতে এটি পুনরায় ফর্ম্যাট করুন" না .. তাই যদি আমি ওয়েবভিউকে দেশী ব্রাউজারের মতো ট্যাগগুলি হ্যান্ডেল করতে রাজি করতে পারি তবে এটি সর্বোত্তম।

আমি স্পষ্টত কিছু স্পষ্টভাবে মিস করছি .. তবে আমার কীসের কোনও ক্লু নেই।



এই একই লাইন বরাবর, আমি আমার ওয়েবসাইটের জন্য এইচটিএমএল 5 প্লেয়ার খুঁজছি। আমার কী ব্যবহার করা উচিত?
ওল্ফপ্যাক'০৮

1
এখানে আমার উত্তর: stackoverflow.com/a/16179544/423171
cprcrack

1
কিছুই কাজ তাই আমি মধ্যে লাগছিল VideoEnabledWebViewএখানে stackoverflow.com/questions/15768837/...
EpicPandaForce

উত্তর:


92

কেউ যদি এটি পড়ে এবং ফলাফলটিতে আগ্রহী সে ক্ষেত্রে আমি এই বিষয়টির উত্তর দিই। কোনও ওয়েবভিউয়ের মধ্যে একটি ভিডিও উপাদান (ভিডিও এইচটিএমএল 5 ট্যাগ) দেখা সম্ভব, তবে আমি অবশ্যই বলতে পারি যে কয়েক দিনের জন্য আমাকে এটি মোকাবেলা করতে হয়েছিল। এই যে পদক্ষেপগুলি আমি এখনও পর্যন্ত অনুসরণ করতে হয়েছিল:

- একটি সঠিকভাবে এনকোড করা ভিডিও সন্ধান করুন

-ভিউভিউ সূচনা করার সময়, জাভাস্ক্রিপ্ট সেট করুন, ওয়েবভিউক্লিয়েন্ট এবং ওয়েবক্রোমক্লিয়েন্ট প্লাগইনগুলি সেট করুন।

url = নতুন স্ট্রিং ("http://broken-links.com/tests/video/"); 
এমওয়েবভিউ = (ওয়েবভিউ) সন্ধান ভিউবিআইআইডি (আর.আইডি.উইউভিউ);
mWebView.setWebChromeClient (chromeClient);
mWebView.setWebViewClient (wvClient);
mWebView.getSettings () setJavaScriptEnabled (সত্য)।
। MWebView.getSettings () setPluginState (PluginState.ON);
mWebView.loadUrl (URL);

- ওয়েবক্রোমক্লিয়েন্ট অবজেক্টে অন-কাস্টমভিউ হ্যান্ডল করুন।

@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
    super.onShowCustomView(view, callback);
    if (view instanceof FrameLayout){
        FrameLayout frame = (FrameLayout) view;
        if (frame.getFocusedChild() instanceof VideoView){
            VideoView video = (VideoView) frame.getFocusedChild();
            frame.removeView(video);
            a.setContentView(video);
            video.setOnCompletionListener(this);
            video.setOnErrorListener(this);
            video.start();
        }
    }
}

ওয়েব ভিউতে ফিরে আসার জন্য ভিডিওটির জন্য অন কমপ্লিট এবং অনঅর ইভেন্টগুলি হ্যান্ডল করুন।

public void onCompletion(MediaPlayer mp) {
    Log.d(TAG, "Video completo");
    a.setContentView(R.layout.main);
    WebView wb = (WebView) a.findViewById(R.id.webview);
    a.initWebView();
}

তবে এখন আমার বলা উচিত এখনও একটি গুরুত্বপূর্ণ বিষয় আছে। আমি এটি একবার খেলতে পারি। দ্বিতীয়বার আমি ভিডিও প্রেরণকারীকে (পোস্টার বা কিছু প্লে বাটন) ক্লিক করি, এটি কিছুই করে না।

আমি ভিডিওটি মিডিয়া প্লেয়ার উইন্ডোটি খোলার পরিবর্তে ওয়েবভিউ ফ্রেমের ভিতরে খেলতে চাই, তবে এটি আমার কাছে গৌণ বিষয়।

আমি আশা করি এটি কাউকে সহায়তা করে এবং আমি কোনও মন্তব্য বা পরামর্শকে ধন্যবাদ জানাতে চাই।

সালুডোস, টেরিকোলাস।


আমি কোনও ফলাফল চালাতে পারি না, আমার পর্দাটি কালো। আমি জানতে চাই যে এটির দরকার নেই কিনা। আমার কোডটি এখানে পোস্ট করার জন্য দীর্ঘ .c
পেঙ্গওয়াং

আপনি কি নিশ্চিত যে কোনও এনকোডিংয়ের সমস্যা নয়? আমি পোস্ট করা URL টি দিয়ে চেষ্টা করুন। স্পষ্টতই এটি নেটিভ ব্রাউজারের সাথে কাজ করতে হবে
mdelolmo

46
"ক" কি? যে ক্রিয়াকলাপ মত হবে?
কলিন দাম

1
@ কলিন দাম এ হ'ল ওয়েব ভিউ হোস্ট করা ক্রিয়াকলাপের একটি উদাহরণ। @ দেগ্রগ্রি, আমি এটি সরবরাহ করতে পারি, তবে এর বাইরে খুব বেশি কিছু নেই। WebChromeClientআপনার প্রয়োজনীয় সংযুক্ত পদ্ধতিগুলিকে একটি শ্রেণি প্রসারিত করুন এবং ওভাররাইড করুন। আপনি যদি জেদ করেন, আমি বাড়ি ফিরে আসার পরে বাকী ক্লাসটি আপলোড করতে পারি।
mdelolmo

6
আইসিএসে কাজ করছেন না যেহেতু getFocusedChild () কোনও ভিডিওভিউ নয়, তবে একটি HTML5VFullScreen $ সারফেসভিডিওভিউ। আইসিএসে কীভাবে করবেন সে সম্পর্কে কোনও ধারণা? ( স্ট্যাকওভারফ্লো
পাস্কাল

61

দীর্ঘ গবেষণার পরে, আমি এই জিনিস কাজ করে। নিম্নলিখিত কোডটি দেখুন:

Test.java

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;

public class Test extends Activity {

    HTML5WebView mWebView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mWebView = new HTML5WebView(this);

        if (savedInstanceState != null) {
            mWebView.restoreState(savedInstanceState);
        } else {    
            mWebView.loadUrl("http://192.168.1.18/xxxxxxxxxxxxxxxx/");
        }

        setContentView(mWebView.getLayout());
    }

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

    @Override
    public void onStop() {
        super.onStop();
        mWebView.stopLoading();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (mWebView.inCustomView()) {
                mWebView.hideCustomView();
            //  mWebView.goBack();
                //mWebView.goBack();
                return true;
            }

        }
        return super.onKeyDown(keyCode, event);
    }
}

এইচটিএমএল% VIDEO.java

package com.ivz.idemandtest;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.webkit.GeolocationPermissions;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;

public class HTML5WebView extends WebView {

    private Context                             mContext;
    private MyWebChromeClient                   mWebChromeClient;
    private View                                mCustomView;
    private FrameLayout                         mCustomViewContainer;
    private WebChromeClient.CustomViewCallback  mCustomViewCallback;

    private FrameLayout                         mContentView;
    private FrameLayout                         mBrowserFrameLayout;
    private FrameLayout                         mLayout;

    static final String LOGTAG = "HTML5WebView";

    private void init(Context context) {
        mContext = context;     
        Activity a = (Activity) mContext;

        mLayout = new FrameLayout(context);

        mBrowserFrameLayout = (FrameLayout) LayoutInflater.from(a).inflate(R.layout.custom_screen, null);
        mContentView = (FrameLayout) mBrowserFrameLayout.findViewById(R.id.main_content);
        mCustomViewContainer = (FrameLayout) mBrowserFrameLayout.findViewById(R.id.fullscreen_custom_content);

        mLayout.addView(mBrowserFrameLayout, COVER_SCREEN_PARAMS);

        // Configure the webview
        WebSettings s = getSettings();
        s.setBuiltInZoomControls(true);
        s.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
        s.setUseWideViewPort(true);
        s.setLoadWithOverviewMode(true);
      //  s.setSavePassword(true);
        s.setSaveFormData(true);
        s.setJavaScriptEnabled(true);
        mWebChromeClient = new MyWebChromeClient();
        setWebChromeClient(mWebChromeClient);

        setWebViewClient(new WebViewClient());

setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);

        // enable navigator.geolocation 
       // s.setGeolocationEnabled(true);
       // s.setGeolocationDatabasePath("/data/data/org.itri.html5webview/databases/");

        // enable Web Storage: localStorage, sessionStorage
        s.setDomStorageEnabled(true);

        mContentView.addView(this);
    }

    public HTML5WebView(Context context) {
        super(context);
        init(context);
    }

    public HTML5WebView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public HTML5WebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    public FrameLayout getLayout() {
        return mLayout;
    }

    public boolean inCustomView() {
        return (mCustomView != null);
    }

    public void hideCustomView() {
        mWebChromeClient.onHideCustomView();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if ((mCustomView == null) && canGoBack()){
                goBack();
                return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    private class MyWebChromeClient extends WebChromeClient {
        private Bitmap      mDefaultVideoPoster;
        private View        mVideoProgressView;

        @Override
        public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback)
        {
            //Log.i(LOGTAG, "here in on ShowCustomView");
            HTML5WebView.this.setVisibility(View.GONE);

            // if a view already exists then immediately terminate the new one
            if (mCustomView != null) {
                callback.onCustomViewHidden();
                return;
            }

            mCustomViewContainer.addView(view);
            mCustomView = view;
            mCustomViewCallback = callback;
            mCustomViewContainer.setVisibility(View.VISIBLE);
        }

        @Override
        public void onHideCustomView() {
            System.out.println("customview hideeeeeeeeeeeeeeeeeeeeeeeeeee");
            if (mCustomView == null)
                return;        

            // Hide the custom view.
            mCustomView.setVisibility(View.GONE);

            // Remove the custom view from its container.
            mCustomViewContainer.removeView(mCustomView);
            mCustomView = null;
            mCustomViewContainer.setVisibility(View.GONE);
            mCustomViewCallback.onCustomViewHidden();

            HTML5WebView.this.setVisibility(View.VISIBLE);
            HTML5WebView.this.goBack();
            //Log.i(LOGTAG, "set it to webVew");
        }


        @Override
        public View getVideoLoadingProgressView() {
            //Log.i(LOGTAG, "here in on getVideoLoadingPregressView");

            if (mVideoProgressView == null) {
                LayoutInflater inflater = LayoutInflater.from(mContext);
                mVideoProgressView = inflater.inflate(R.layout.video_loading_progress, null);
            }
            return mVideoProgressView; 
        }

         @Override
         public void onReceivedTitle(WebView view, String title) {
            ((Activity) mContext).setTitle(title);
         }

         @Override
         public void onProgressChanged(WebView view, int newProgress) {
             ((Activity) mContext).getWindow().setFeatureInt(Window.FEATURE_PROGRESS, newProgress*100);
         }

         @Override
         public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
             callback.invoke(origin, true, false);
         }
    }


    static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS =
        new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

custom_screen.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2009 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.
-->

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android">
    <FrameLayout android:id="@+id/fullscreen_custom_content"
        android:visibility="gone"
        android:background="@color/black"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    />
    <LinearLayout android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout android:id="@+id/error_console"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
        />

        <FrameLayout android:id="@+id/main_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
        />
    </LinearLayout>
</FrameLayout>

video_loading_progress.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2009 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.
-->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/progress_indicator"
         android:orientation="vertical"
         android:layout_centerInParent="true"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content">

       <ProgressBar android:id="@android:id/progress"
           style="?android:attr/progressBarStyleLarge"
           android:layout_gravity="center"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content" />

       <TextView android:paddingTop="5dip"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_gravity="center"
           android:text="@string/loading_video" android:textSize="14sp"
           android:textColor="?android:attr/textColorPrimary" />
 </LinearLayout>

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
/* //device/apps/common/assets/res/any/http_authentication_colors.xml
**
** Copyright 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.
*/
-->
<!-- FIXME: Change the name of this file!  It is now being used generically
    for the browser -->
<resources>
    <color name="username_text">#ffffffff</color>
    <color name="username_edit">#ff000000</color>

    <color name="password_text">#ffffffff</color>
    <color name="password_edit">#ff000000</color>

    <color name="ssl_text_label">#ffffffff</color>
    <color name="ssl_text_value">#ffffffff</color>

    <color name="white">#ffffffff</color>
    <color name="black">#ff000000</color>



    <color name="geolocation_permissions_prompt_background">#ffdddddd</color>
</resources>

Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.test"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="7" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Test"
                  android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            android:configChanges="orientation|keyboardHidden|keyboard">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>  
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
</manifest>

আপনি বুঝতে পারবেন বাকি জিনিসগুলির প্রত্যাশা করা।


7
এই এক গ্রহণযোগ্য উত্তর হওয়া উচিত। সুরেন্দ্র এবং মালেনকি আপনি দুজনেই আমার বিচক্ষণতা বাঁচিয়েছিলেন। আমার জন্য দুর্দান্ত কাজ করেছেন
জর্জ বেকার

আমি জর্জের সাথে একমত অ্যান্ড্রয়েড নেটিভ ব্রাউজারটি ঠিক এইভাবে ভিডিওভিউয়ের সাথে কাজ করে। মনে হচ্ছে এটি এখানে কোড . google.com/p/html5 ওয়েবেভিউর মতো একই কোড । এটি সমস্ত অ্যান্ড্রয়েড সংস্করণে দুর্দান্ত কাজ করে (আমি অ্যান্ড্রয়েড ২.২ এবং তারপরেও পরীক্ষা করেছি)। কেবলমাত্র একটি জিনিস যা আমি লক্ষ্য করতে চেয়েছিলাম, আপনার মনে রাখা উচিত যে আপনি যদি 13 বছরের উপরে কোনও কিছুতে টার্গেট এসডিকে পরিবর্তন করেন তবে আপনার ক্রিয়াকলাপটি ওরিয়েন্টেশন পরিবর্তনে পুনরায় তৈরি করা হবে। এটি এড়াতে স্ক্রিন সাইজে অ্যান্ড্রয়েডে যুক্ত করুন: কনফিগ চেঞ্জ (তবে এই ক্ষেত্রে আপনার কমপক্ষে sdk <13 ব্যবহার করতে হবে) বা পুরানো টার্গেট এসডিকে ব্যবহার করতে হবে (তারপরে আপনি অ্যান্ড্রয়েড রাখতে পারেন: কনফিগার চেঞ্জ)
ইউরি আশায়ভ

2
এটি আমাকে নেক্সাস 7 (অ্যান্ড্রয়েড 4.1) এ একটি সাদা ফাঁকা স্ক্রিন দিচ্ছে। কোন ধারনা কিভাবে এটা ঠিক করতে হবে?
সাহিল

ব্যাকবটন ভিডিও এবং অডিওটি এখনও শ্রুতিমধুর বন্ধ করে দেয় না, কীভাবে এটি ঠিক করবেন?
CONvid19

আমি নেটিভ ব্রাউজারের প্রবাহের মতোই এটির সন্ধান করছিলাম .. ধন্যবাদ টন সুরেন্দ্র এবং মালেনকি।
অভিলাশ

33

mdelolmo এর উত্তরটি অবিশ্বাস্যরূপে সহায়ক ছিল, তবে যেমনটি তিনি বলেছিলেন, ভিডিওটি কেবল একবার চালায় এবং তারপরে আপনি এটি আবার খুলতে পারবেন না।

আমি এটিকে কিছুটা লক্ষ্য করেছি এবং আমি যা পেয়েছি তা এখানেই রয়েছে, যদি ভবিষ্যতে আমার মতো কোনও ক্লান্ত ওয়েবভিউ ভ্রমণকারীরা এই পোস্টে হোঁচট খায়।

প্রথমত, আমি দিকে তাকিয়ে VideoView এবং মিডিয়াপ্লেয়ার এর ডকুমেন্টেশন এবং কিভাবে এই কাজ একটি ভাল ধারনা পেয়েছিলাম। আমি দৃ strongly়ভাবে তাদের সুপারিশ।

তারপরে, অ্যান্ড্রয়েড ব্রাউজারটি এটি কীভাবে করে তা দেখতে আমি উত্স কোডটির দিকে চেয়েছিলাম । একটি পৃষ্ঠা খুঁজে পান এবং তারা কীভাবে পরিচালনা করে তা দেখুন onShowCustomView()। তারা একটি রেফারেন্স রাখেCustomViewCallback কাস্টম ভিউয়ের ।

এই সমস্তটি এবং mdelolmo এর উত্তরটি মনে রেখে, আপনি যখন ভিডিওটি সম্পন্ন করেন, আপনাকে কেবল দুটি জিনিসই করতে হবে। প্রথমে, VideoViewআপনি যে রেফারেন্সটি সংরক্ষণ করেছেন তাতে কল করুন stopPlayback()যা MediaPlayerপরে অন্য কোথাও ব্যবহারের জন্য প্রকাশ করবে । আপনি ভিডিওভিউ উত্স কোডে এটি দেখতে পারেন । দ্বিতীয়ত, CustomViewCallbackআপনি কল করার জন্য একটি রেফারেন্স সংরক্ষণ করেছিলেনCustomViewCallback.onCustomViewHidden()

এই দুটি জিনিস করার পরে, আপনি একই ভিডিও বা অন্য কোনও ভিডিওতে ক্লিক করতে পারেন এবং এটি আগের মতোই খুলবে। পুরো ওয়েবভিউ পুনরায় আরম্ভ করার দরকার নেই।

আশা করি এইটি কাজ করবে.


আসলে আমি এটিকেও সমাধান করেছি, সমাধান পোস্ট করা আমার মনে নেই (আমার জন্য লজ্জা)। আপনার মতোই আমাকেও অ্যান্ড্রয়েড ব্রাউজারের কোডটি দেখতে হবে এবং খুব বেশি যুক্ত করার দরকার নেই, আমি প্লেয়ারটি থামানোর জন্য অনক্লিপশন শ্রোতার ব্যবহার করেছি এবং বেশ কয়েকবার দৃশ্যমানতা সেট করতে হয়েছিল, তবে আমি আপনার সমাধানটি কিনব। শুভেচ্ছা সহ!
mdelolmo

1
গুগল কোড অনুসন্ধানটি অবসর নিয়েছে, আমার মনে হয় ব্রাউজারঅ্যাক্টিভিটি.জভা (ফ্রোইও থেকে) এর এই সংস্করণটি এখানে বর্ণিতটির সাথে মোটামুটিভাবে মিলেছে
মিচিয়াকিগ

@ স্পেসম্যানকির লিঙ্কযুক্ত কোডটিতে পুরো রেপোতে ভিডিওভিউয়ের কোনও উল্লেখ নেই। আমার ধারণা ব্রাউজারঅ্যাক্টিভিটি এখন এটি অন্যভাবে করে। এমনকি আমি ইক্লেয়ারের মুক্তিতে ফিরে গিয়েছিলাম। কোনও ব্যবহার খুঁজে পাচ্ছি না।
এমএক্সএলসিএল

আমার এই সমস্ত সমস্যাটি হ'ল আমি ফ্রেম.জেটফোকাসডিল্ড () থেকে ফিরে যাচ্ছি; ভিউভিউয়ের পরিবর্তে একটি এইচটিএমএল 5 ভিডিওভিউ এবং অতএব এগুলির কোনওটিই আমার পক্ষে কাজ করে না এবং পূর্ণস্ক্রিনে স্যুইচ করতে পারে না :( আমি অ্যান্ড্রয়েডে 4.1.2 এ আছি।
গোনান

1
পরিশেষে আমার পক্ষে এটিটি কী ছিল তা হ'ল: @ ওভাররাইড পাবলিক শূন্য অনসটপ () {সুপার.অনসটপ (); mWebView.destroy (); activity ক্রিয়াকলাপে ... ওয়েবভিউ.ডেস্ট্রয় () অত্যন্ত গুরুত্বপূর্ণ ছিল
ম্যাকডি

8

আসলে, এটি কেবল ক্লায়েন্ট ভিউয়ের সাথে একটি স্টক WebChromeClient সংযুক্ত করার পক্ষে যথেষ্ট বলে মনে হচ্ছে la

mWebView.setWebChromeClient(new WebChromeClient());

এবং আপনার হার্ডওয়ার ত্বরণ চালু করা দরকার!

কমপক্ষে, আপনার যদি একটি পূর্ণ-স্ক্রিন ভিডিও চালানোর দরকার না হয়, তবে ভিডিওভিউটিকে ওয়েবভিউ থেকে বাইরে টানতে এবং এটিকে ক্রিয়াকলাপের দৃষ্টিতে ঠেলে দেওয়ার দরকার নেই। এটি ভিডিও উপাদানটির বরাদ্দ প্রাপ্ত অংশগুলিতে খেলবে।

কোনও ধারণাগুলি কীভাবে প্রসারিত ভিডিও বোতামটি আটকাবেন?


আপনি ওয়েব ক্রোমক্লিনেন্ট এবং ওভাররাইডিং শো কাস্টমভিউ ব্যবহার করে এটি বন্ধ করতে পারেন
ফ্রাঙ্ক

Android এর কোন সংস্করণ নির্দিষ্ট করুন। এটি বিভিন্ন সংস্করণের জন্য আলাদাভাবে কাজ করে।
ইথান_এআইআই

7

আমি জানি যে এই থ্রেডটি বেশ কয়েক মাস পুরানো, তবে ভিডিওটি পূর্ণস্ক্রিন না করে ওয়েবভিউয়ের ভিতরে প্লে করার একটি সমাধান খুঁজে পেয়েছি (তবে এখনও মিডিয়া প্লেয়ারে ...)। এখনও অবধি, আমি ইন্টারনেটে এটিতে কোনও ইঙ্গিত পাইনি তাই এটি অন্যদের জন্যও আকর্ষণীয়। আমি এখনও কিছু সমস্যা নিয়ে লড়াই করছি (যেমন মিডিয়া প্লেয়ারকে পর্দার ডান অংশে রাখছি, কেন আমি এটি ভুল করছি তা জানেন না তবে এটি আমার তুলনায় একটি ছোট সমস্যা ...)।

কাস্টম ChromeClient এ লেআউটপ্যারাম নির্দিষ্ট করুন:

// 768x512 is the size of my video
FrameLayout.LayoutParams LayoutParameters = 
                                     new FrameLayout.LayoutParams (768, 512); 

আমার অনশো কাস্টমভিউ পদ্ধতিটি দেখতে এমন দেখাচ্ছে:

public void onShowCustomView(final View view, final CustomViewCallback callback) {
     // super.onShowCustomView(view, callback);
     if (view instanceof FrameLayout) {
         this.mCustomViewContainer = (FrameLayout) view;
         this.mCustomViewCallback = callback;
         this.mContentView = (WebView) this.kameha.findViewById(R.id.webview);
         if (this.mCustomViewContainer.getFocusedChild() instanceof VideoView) {
             this.mCustomVideoView = (VideoView) 
                                     this.mCustomViewContainer.getFocusedChild();
             this.mCustomViewContainer.setVisibility(View.VISIBLE);
             final int viewWidth = this.mContentView.getWidth();
             final int viewLeft = (viewWidth - 1024) / 2;
             // get the x-position for the video (I'm porting an iPad-Webapp to Xoom, 
             // so I can use those numbers... you have to find your own of course...
             this.LayoutParameters.leftMargin = viewLeft + 256; 
             this.LayoutParameters.topMargin = 128;
             // just add this view so the webview underneath will still be visible, 
             // but apply the LayoutParameters specified above
             this.kameha.addContentView(this.mCustomViewContainer, 
                                             this.LayoutParameters); 
             this.mCustomVideoView.setOnCompletionListener(this);
             this.mCustomVideoView.setOnErrorListener(this);
             // handle clicks on the screen (turning off the video) so you can still
             // navigate in your WebView without having the video lying over it
             this.mCustomVideoView.setOnFocusChangeListener(this); 
             this.mCustomVideoView.start();
         }
     }
 }

সুতরাং, আমি আশা করি আমি সহায়তা করতে পারি ... আমাকেও ভিডিও-এনকোডিং দিয়ে ঘুরে বেড়াতে হয়েছিল এবং এইচটিএমএল 5 ভিডিওর সাথে ওয়েব ভিউ ব্যবহার করার বিভিন্ন ধরণ ছিল - শেষ পর্যন্ত আমার কার্যকরী কোডটি বিভিন্ন কোড-অংশগুলির মধ্যে একটি বুনো মিশ্রণ ছিল যা আমি পেয়েছিলাম ইন্টারনেট এবং কিছু জিনিস আমার নিজের দ্বারা নির্ধারণ করতে হয়েছিল। সত্যিই এটি * এর ব্যথা ছিল।


আইসিএসে, getFocusedChild () কোনও ভিডিওভিউ ফেরায় না। আইসিএসে এই কাজটি কীভাবে করা যায় সে সম্পর্কে কোনও ধারণা?
পাস্কাল

4

এই পদ্ধতিটি 2.3 অবধি খুব ভালভাবে কাজ করে এবং হার্ডওয়্যারসিলারেটেড = যুক্ত করে এটি এমনকি 3.0 থেকে আইসিএসেও কাজ করে যা একটি সমস্যা বর্তমানে আমি মুখোমুখি হয়েছি মিডিয়া প্লেয়ার অ্যাপ্লিকেশনটির দ্বিতীয় প্রবর্তন ক্র্যাশ হয়ে যাচ্ছে কারণ আমি প্লেব্যাক বন্ধ না করে মিডিয়া প্লেয়ারকে মুক্তি দিয়েছি। যেমন ভিডিওসুরফেসভিউ অবজেক্ট, যা আমরা OS.০ ওএস থেকে শোগুলিভিউ ফাংশনটিতে পেয়েছি, এটি ব্রাউজারের সাথে নির্দিষ্ট এবং ২.৩ ওএস অবধি কোনও ভিডিওভিউ অবজেক্ট নয়, আমি কীভাবে এটিতে অ্যাক্সেস করতে পারি এবং স্টপপ্লেব্যাক এবং রিলিজ রিসোর্সগুলি কীভাবে করব?


3

এএম এর ব্রোভারঅ্যাক্টিভিটির সাথে সমান । ফ্রেমলিআউট.লয়আউটপ্যারামস লেআউটপ্যারামিটারগুলি = নতুন ফ্রেমলআউট.লায়আউটপ্যারামস (768, 512);

আমি মনে করি আমরা ব্যবহার করতে পারি

FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT,
            FrameLayout.LayoutParams.FILL_PARENT) 

পরিবর্তে.

আমি অন্য একটি সমস্যার মুখোমুখি হয়েছি যে ভিডিওটি চলমান থাকলে এবং ব্যবহারকারীরা পরের বার, আপনি এই ক্রিয়াকলাপটিতে যান (সিঙ্গলটপ এক) এবং ভিডিওটি প্লে করতে পারবেন না। এই ঠিক করতে, আমি ফোন

try { 
    mCustomVideoView.stopPlayback();  
    mCustomViewCallback.onCustomViewHidden();
} catch(Throwable e) { //ignore }

ক্রিয়াকলাপের অনব্যাকপ্রেসড পদ্ধতিতে।


2

আমি জানি এটি একটি খুব পুরানো প্রশ্ন, তবে আপনি কি hardwareAccelerated="true"আপনার অ্যাপ্লিকেশন বা ক্রিয়াকলাপের জন্য প্রকাশিত পতাকাটি ব্যবহার করে দেখেছেন?

এই সেটটি দিয়ে, এটি কোনও ওয়েবক্রোমক্লিয়েন্ট পরিবর্তন ছাড়াই কাজ করছে বলে মনে হচ্ছে (যা আমি কোনও ডিওএম-এলিমেন্টের কাছ থেকে আশা করব))


2
hardwareAcceleratedঅ্যান্ড্রয়েড 3.0 থেকে শুরু হয়
vbence

2

আমি এই সমস্যাটি সমাধান করার জন্য এইচটিএমএল 5 ওয়েবভিউ ব্যবহার করেছি load ডাউনলোড করুন এবং এটি আপনার প্রকল্পে রাখুন তবে আপনি ঠিক এর মতো কোড করতে পারেন।

private HTML5WebView mWebView;
String url = "SOMEURL";
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mWebView = new HTML5WebView(this);
    if (savedInstanceState != null) {
            mWebView.restoreState(savedInstanceState);
    } else {
            mWebView.loadUrl(url);
    }
    setContentView(mWebView.getLayout());
}
@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    mWebView.saveState(outState);
}

ভিডিওটি ঘোরানোর উপযোগী করতে, অ্যান্ড্রয়েড: কনফিগারেশন = "ওরিয়েন্টেশন" কোডটি আপনার ক্রিয়াকলাপে উদাহরণস্বরূপ রাখুন (Androidmanifest.xML)

<activity android:name=".ui.HTML5Activity" android:configChanges="orientation"/>

এবং onCfigrationChanged পদ্ধতিতে ওভাররাইড করুন।

@Override
public void onConfigurationChanged(Configuration newConfig) {
     super.onConfigurationChanged(newConfig);
}

2

এই প্রশ্নটি বহু বছরের পুরানো, তবে সম্ভবত আমার উত্তরটি আমার মতো লোকদের সহায়তা করবে যাদের পুরানো অ্যান্ড্রয়েড সংস্করণ সমর্থন করতে হবে। আমি অনেকগুলি ভিন্ন পদ্ধতির চেষ্টা করেছিলাম যা কিছু অ্যান্ড্রয়েড সংস্করণে কাজ করেছিল, তবে তা নয়। আমি খুঁজে পাওয়া সবচেয়ে ভাল সমাধান হ'ল ক্রসওয়াক ওয়েবভিউ ব্যবহার করা যা এইচটিএমএল 5 বৈশিষ্ট্য সমর্থনটির জন্য অনুকূলিত হয়েছে এবং অ্যান্ড্রয়েড 4.1 এবং ততোধিক সংস্করণে কাজ করে। এটি ডিফল্ট অ্যান্ড্রয়েড ওয়েবভিউ হিসাবে ব্যবহার করা সহজ। আপনাকে কেবল গ্রন্থাগারটি অন্তর্ভুক্ত করতে হবে। এটি কীভাবে ব্যবহার করবেন সে সম্পর্কে এখানে আপনি একটি সহজ টিউটোরিয়াল পেতে পারেন: https://diego.org/2015/01/07/eebeding-crosswalk-in-android-studio/


দ্রষ্টব্য: ক্রসওয়াক আর রক্ষণাবেক্ষণ করা হয় না।
slhck

1

ওয়েল, দৃশ্যত এটি ভিডিও ইভেন্টটি পেতে কোনও প্লাগইন নিবন্ধিত করতে কোনও জেএনআই ব্যবহার না করেই সম্ভব নয়। (ব্যক্তিগতভাবে, আমি জেএনআই-এর বিষয়টি এড়িয়ে চলেছি যেহেতু পরের কয়েক মাসে জাভাটির বহনযোগ্যতা হারাতে গিয়ে পরমাণু-ভিত্তিক অ্যান্ড্রয়েড ট্যাবলেটগুলি প্রকাশিত হলে আমি কোনও জগাখিচির মোকাবেলা করতে চাই না))

একমাত্র আসল বিকল্পটি মনে হয় কেবল ওয়েবভিউর জন্য একটি নতুন ওয়েব পৃষ্ঠা তৈরি করা এবং উপরের কোডারাল্ক ইউআরএল অনুসারে একটি এইচআরএফ লিঙ্ক সহ ভিডিওটি পুরাতন-স্কুল উপায়ে করা do

কিনতে হত।


1

মধুচক্র ব্যবহার hardwareaccelerated=trueএবং pluginstate.on_demandকাজ বলে মনে হচ্ছে


1

আমারও একই সমস্যা ছিল। আমার অ্যাপ্লিকেশনটির সম্পদ-ফোল্ডারে আমার এইচটিএমএল ফাইল এবং ভিডিও ছিল।

অতএব ভিডিওগুলি APK এর ভিতরে অবস্থিত। যেহেতু APK সত্যই একটি জিপ ফাইল, ওয়েব ভিউ ভিডিও-ফাইলগুলি পড়তে সক্ষম হয় নি।

সমস্ত HTML- এবং ভিডিও-ফাইলগুলি এসডি-কার্ডে অনুলিপি করা আমার পক্ষে কাজ করেছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.