Aman Virk
Aman Virk

Reputation: 3967

Android WebView crashes application on android 4.0 +

I am having hard time running webview using my application as it crashes the app right way.

Java

package com.unext.unextlibrary;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;


  @SuppressLint("SetJavaScriptEnabled")
   public class InitializeVideo extends Activity {

WebView mWebview;

@Override
@JavascriptInterface
public void onCreate(Bundle icicle) {
    setContentView(R.layout.activity_video_play);

    getWindow().requestFeature(Window.FEATURE_PROGRESS);
    mWebview  = new WebView(this);

    mWebview.getSettings().setJavaScriptEnabled(true); // enable javascript

    final Activity activity = this;

    mWebview.setWebViewClient(new WebViewClient() {
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Toast.makeText(activity, description, Toast.LENGTH_SHORT).show();
        }
    });

    mWebview .loadUrl("http://www.google.com");
    setContentView(mWebview );
}
}

XML CODE

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
android:orientation="vertical" >

 <android.webkit.WebView android:id="@+id/WebView"
    android:layout_width="fill_parent" android:layout_height="fill_parent">
</android.webkit.WebView>

</LinearLayout>

Inside my manifest i am targeting sdk version as 17

Manifest goes here

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="17" />

  <uses-permission android:name="android.permission.INTERNET"/>

 <activity
        android:theme="@style/Theme.Video"
        android:configChanges="orientation|screenSize"
        android:name="com.unext.unextlibrary.InitializeVideo"
        android:label="@string/app_name" >
     </activity> 

Also my logcat output shows as follow

01-24 07:11:09.091: E/AndroidRuntime(2457): FATAL EXCEPTION: main
    01-24 07:11:09.091: E/AndroidRuntime(2457): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.unext.unextlibrary/com.unext.unextlibrary.InitializeVideo}: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
    01-24 07:11:09.091: E/AndroidRuntime(2457):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
    01-24 07:11:09.091: E/AndroidRuntime(2457):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
    01-24 07:11:09.091: E/AndroidRuntime(2457):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
    01-24 07:11:09.091: E/AndroidRuntime(2457):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
    01-24 07:11:09.091: E/AndroidRuntime(2457):     at android.os.Handler.dispatchMessage(Handler.java:99)
    01-24 07:11:09.091: E/AndroidRuntime(2457):     at android.os.Looper.loop(Looper.java:137)
    01-24 07:11:09.091: E/AndroidRuntime(2457):     at android.app.ActivityThread.main(ActivityThread.java:5039)
    01-24 07:11:09.091: E/AndroidRuntime(2457):     at java.lang.reflect.Method.invokeNative(Native Method)
    01-24 07:11:09.091: E/AndroidRuntime(2457):     at java.lang.reflect.Method.invoke(Method.java:511)
    01-24 07:11:09.091: E/AndroidRuntime(2457):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
    01-24 07:11:09.091: E/AndroidRuntime(2457):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
    01-24 07:11:09.091: E/AndroidRuntime(2457):     at dalvik.system.NativeStart.main(Native Method)
    01-24 07:11:09.091: E/AndroidRuntime(2457): Caused by: android.util.AndroidRuntimeException: requestFeature() must be called before adding content
    01-24 07:11:09.091: E/AndroidRuntime(2457):     at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:229)
    01-24 07:11:09.091: E/AndroidRuntime(2457):     at com.unext.unextlibrary.InitializeVideo.onCreate(InitializeVideo.java:24)
    01-24 07:11:09.091: E/AndroidRuntime(2457):     at android.app.Activity.performCreate(Activity.java:5104)
    01-24 07:11:09.091: E/AndroidRuntime(2457):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
    01-24 07:11:09.091: E/AndroidRuntime(2457):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
    01-24 07:11:09.091: E/AndroidRuntime(2457):     ... 11 more

Upvotes: 0

Views: 1766

Answers (4)

Shadow
Shadow

Reputation: 6899

And also dont forget to use "android:hardwareAccelerated=true" in android manifest file

especially for android 4 and above.

Upvotes: 0

Pratik
Pratik

Reputation: 30855

Your code

public void onCreate(Bundle icicle) {
    setContentView(R.layout.activity_video_play);

Now put the comment this setContentView() statement as no need and add new statement

public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    //setContentView(R.layout.activity_video_play);

As the request for the another window feature must set prior to set the content view so window was prepared for the content view which you are using it. Another point is either you used Layout for setContentView() or just put single component in this as you are using both first used the layout and then last set the webview this was over write the layout with webview

Upvotes: 0

GrIsHu
GrIsHu

Reputation: 23638

Try to change as below :

setContentView(R.layout.activity_video_play); getWindow().requestFeature(Window.FEATURE_PROGRESS);

Use this way instead:

getWindow().requestFeature(Window.FEATURE_PROGRESS); setContentView(R.layout.activity_video_play);

Upvotes: 2

Andro Selva
Andro Selva

Reputation: 54322

Try this way,

public void onCreate(Bundle icicle) {
getWindow().requestFeature(Window.FEATURE_PROGRESS);
    setContentView(R.layout.activity_video_play);

its because, requestFeature() must be called before calling setContentView();

Upvotes: 1

Related Questions