My app works totally fine until I added a splash screen feature to my app. I tried to follow some solutions available on internet. The problem occurs when I execute my app in android emulator for very few seconds it shows me an alert box showing the following statement
Waiting for Debugger
Application TestApp (process com.testapp.mytestapp) is waiting for the debugger to attach.
Force Close button
And after it my app runs absolutely fine. I am still not sure whether its and error or something else because of my poor coding skills and I made a mistake in my code or missed something. Also I wanted to increase the duration of the Splash Image (somehow possible) because sometimes the splash image disappears before complete loading of the webpage but as I am new to android development I am unable to figure out a proper solution or reference to following. Further my emulator version is Nexus 4 API 22
Here is my Main MyActivity class
package com.testapp.mytestapp;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import java.io.File;
import static com.testapp.mytestapp.R.*;
public class MyActivity extends Activity {
private WebView webView;
private FrameLayout customViewContainer;
private WebChromeClient.CustomViewCallback customViewCallback;
private View mCustomView;
private myWebChromeClient mWebChromeClient;
private myWebViewClient mWebViewClient;
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
customViewContainer = (FrameLayout) findViewById(R.id.customViewContainer);
webView = (WebView) findViewById(R.id.webView);
ConnectivityManager conMgr = (ConnectivityManager) getApplicationContext().getSystemService(this.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = conMgr.getActiveNetworkInfo();
if (netInfo == null || !netInfo.isConnected() || !netInfo.isAvailable()) {
AlertDialog alertDialog;
alertDialog = new AlertDialog.Builder(this, style.AlertDialogCustom).create();
alertDialog.setTitle("Communication Error");
alertDialog.setMessage("Please make sure that internet connection is active.");
alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
alertDialog.show();
} else {
AppRater appRater = new AppRater(this);
appRater.setDaysBeforePrompt(1);
appRater.setLaunchesBeforePrompt(3);
appRater.setPhrases("Rate This App",
"If you like our App don't forget to rate our application on Google Play. Thanks for your support!",
"Rate Now", "Later", "Ignore");
appRater.setTargetUri("https://play.google.com/store/apps/details?id=" + getApplicationContext().getPackageName());
appRater.show();
customViewContainer = (FrameLayout) findViewById(R.id.customViewContainer);
webView = (WebView) findViewById(R.id.webView);
mWebViewClient = new myWebViewClient();
webView.setWebViewClient(mWebViewClient);
mWebChromeClient = new myWebChromeClient();
webView.setWebChromeClient(mWebChromeClient);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAppCacheEnabled(true);
webView.getSettings().setSaveFormData(true);
webView.loadUrl("https://custom-domain-name.com");
webView.setWebViewClient(new MyAppWebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
//hide loading image
findViewById(R.id.imageLoading1).setVisibility(View.GONE);
//show webview
findViewById(R.id.customViewContainer).setVisibility(View.VISIBLE);
}
});
}
}
public boolean inCustomView() {
return (mCustomView != null);
}
public void hideCustomView() {
mWebChromeClient.onHideCustomView();
}
@Override
protected void onPause() {
super.onPause(); //To change body of overridden methods use File | Settings | File Templates.
webView.onPause();
}
@Override
protected void onResume() {
super.onResume(); //To change body of overridden methods use File | Settings | File Templates.
webView.onResume();
}
@Override
protected void onStop() {
super.onStop(); //To change body of overridden methods use File | Settings | File Templates.
if (inCustomView()) {
hideCustomView();
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (inCustomView()) {
hideCustomView();
return true;
}
if ((mCustomView == null) && webView.canGoBack()) {
webView.goBack();
return true;
}
}
return super.onKeyDown(keyCode, event);
}
class myWebChromeClient extends WebChromeClient {
private Bitmap mDefaultVideoPoster;
private View mVideoProgressView;
@Override
public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) {
onShowCustomView(view, callback); //To change body of overridden methods use File | Settings | File Templates.
}
@Override
public void onShowCustomView(View view,CustomViewCallback callback) {
// if a view already exists then immediately terminate the new one
if (mCustomView != null) {
callback.onCustomViewHidden();
return;
}
mCustomView = view;
webView.setVisibility(View.GONE);
customViewContainer.setVisibility(View.VISIBLE);
customViewContainer.addView(view);
customViewCallback = callback;
}
@Override
public View getVideoLoadingProgressView() {
if (mVideoProgressView == null) {
LayoutInflater inflater = LayoutInflater.from(MyActivity.this);
mVideoProgressView = inflater.inflate(R.layout.video_progress, null);
}
return mVideoProgressView;
}
@Override
public void onHideCustomView() {
super.onHideCustomView(); //To change body of overridden methods use File | Settings | File Templates.
if (mCustomView == null)
return;
webView.setVisibility(View.VISIBLE);
customViewContainer.setVisibility(View.GONE);
// Hide the custom view.
mCustomView.setVisibility(View.GONE);
// Remove the custom view from its container.
customViewContainer.removeView(mCustomView);
customViewCallback.onCustomViewHidden();
mCustomView = null;
}
}
class myWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url); //To change body of overridden methods use File | Settings | File Templates.
}
}
@Override
protected void onDestroy() {
super.onDestroy();
try {
trimCache(); //if trimCache is static
} catch (Exception e) {
e.printStackTrace();
}
}
public void trimCache() {
try {
File dir = getCacheDir();
if (dir != null && dir.isDirectory()) {
deleteDir(dir);
}
} catch (Exception e) {
// TODO: handle exception
}
}
public static boolean deleteDir(File dir) {
if (dir != null && dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
return dir.delete();
}
return false;
}
}
Here is my MyAppWebViewClient Class
package com.testapp.mytestapp;
import android.content.Intent;
import android.net.Uri;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MyAppWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(Uri.parse(url).getHost().endsWith("custom-domain-name.com")) {
return false;
}
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
view.getContext().startActivity(intent);
return true;
}
}
Here is my AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.testapp.mytestapp" >
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher"
android:hardwareAccelerated="true">
<activity android:name=".MyActivity"
android:configChanges="orientation|keyboardHidden"
android:hardwareAccelerated="true"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
Here is my layout's main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView android:id="@+id/imageLoading1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="visible"
android:src="@drawable/splash_me2"
android:scaleType = "centerCrop" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<WebView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/webView"
android:layout_gravity="center"
/>
<FrameLayout
android:id="@+id/customViewContainer"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone"
/>
</LinearLayout>
Here is my Log from LogCat
11-30 16:10:06.709: E/Launcher(1465): Unable to launch. tag=ApplicationInfo(title=TestApp P=UserHandle{0}) intent=Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.testapp.mytestapp/.MyActivity (has extras) }
11-30 16:10:06.709: E/Launcher(1465): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.testapp.mytestapp/com.testapp.mytestapp.MyActivity}; have you declared this activity in your AndroidManifest.xml?
11-30 16:16:20.860: E/InputDispatcher(1244): channel '2fc7fe4c com.testapp.mytestapp/com.testapp.mytestapp.MyActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
You can ignore that message from the debugger sometimes it just take a little time to run in the emulator.
You could track the progress on your WebChromeClient and check when it's 100.
webView.setWebChromeClient(new myWebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
if (progress == 100) {
//...page is fully loaded.
findViewById(R.id.imageLoading1).setVisibility(View.GONE);
//show webview
findViewById(R.id.customViewContainer).setVisibility(View.VISIBLE);
}
}
});
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.