I have made two attempts in trying to access a website with authentication, and I am not sure what is wrong with my attempts. I will list each one. Has anyone tried this and gotten it to work?
This should not be difficult for Java Android programmers to understand, nor should it matter that I am using monodroid EDIT (It DOES matter, because I have a Java implementation below that works just fine)END EDIT.
I am trying to gain access to an SSRS RDL through the WebView and I need to plug in some generic credentials.
ACTIVITY:
public static string username = "...";
public static string password = "...";
public static string website = "http://10.0.0.5/Reports";
private WebView webView;
private void setupWebView(int attempt)
{
webView.Settings.JavaScriptEnabled = true;
webView.Settings.BlockNetworkLoads = false;
switch (attempt)
{
case 1:
{
webView.SetHttpAuthUsernamePassword(website, "", username, password);
}break;
case 2:
{
webView.SetWebViewClient(new AuthenticationClient(this));
}break;
}
webView.LoadUrl(website);
}
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
webView = new WebView(this);
setupWebView(1);//1 or 2 depending on what I am testing
// Set our view from the "main" layout resource
SetContentView(webView);
}
}
AuthenticationClient:
//DECLARED IN ANOTHER FILE
[Android.Runtime.Register("android/webkit/WebViewClient", DoNotGenerateAcw = true)]
public class AuthenticationClient:WebViewClient
{
private Context _context;
public AuthenticationClient(Context context)
{
_context = context;
}
public override void OnReceivedError(WebView view, ClientError errorCode, string description, string failingUrl)
{
Toast.MakeText(_context, "OnReceivedError: " + errorCode, ToastLength.Long);
//base.OnReceivedError(view, errorCode, description, failingUrl);
}
public override void OnPageStarted(WebView view, string url, Android.Graphics.Bitmap favicon)
{
Toast.MakeText(_context, "OnPageStarted: " + url, ToastLength.Long);
//base.OnPageStarted(view, url, favicon);
}
public override bool ShouldOverrideUrlLoading(WebView view, string url)
{
Toast.MakeText(_context, "ShouldOverrideUrlLoading: " + url, ToastLength.Long);
view.LoadUrl(url);
return true;
}
public override void OnReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, string host, string realm)
{
Toast.MakeText(_context, "OnReceivedHttpAuthRequest: " + host, ToastLength.Long);
handler.Proceed(Activity1.username, Activity1.password);
}
}
//END DECLARATION
ATTEMPT 1: It does not even try to load the page. I keep getting an error:
chromium(18710): external/chromium/net/http/http_auth_gssapi_posix.cc:463: [0821/095922:WARNING:http_auth_gssapi_posix.cc(463)] Unable to find a compatible GSSAPI library
ATTEMPT 2: Does not show a single toast message.
I have already looked at:
http://developer.android.com/reference/android/webkit/WebView.html
Using WebView setHttpAuthUsernamePassword?
WebView.setHttpAuthUsernamePassword() not working?
Passing username and password to SSRS 2005 reports from web application
OTHER STUFF
I have now done it in Java and it works fine. I still need a Mono for Android solution:
public class Android_reporttestActivity extends Activity {
public static String username = "...";
public static String password = "...";
public static String website = "http://10.0.0.5/Reports";
private WebView setupWebView()
{
WebView webView = new WebView(this);
webView.setWebViewClient(
new WebViewClient(){
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm)
{
handler.proceed(username,password);
}
}
);
return webView;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WebView webview = setupWebView();
// Set our view from the "main" layout resource
setContentView(webview);
webview.loadUrl(website);
}
Running the following for me allows everything to work as expected for me:
[Activity (Label = "WebViewExample", MainLauncher = true)]
public class Activity1 : Activity
{
string url;
WebView mWebView;
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main);
url = "http://awebsite.com";
mWebView = (WebView)FindViewById<WebView> (Resource.Id.webview);
mWebView.SetWebViewClient (new ViewClient (this));
mWebView.Settings.JavaScriptEnabled = (true);
mWebView.Settings.PluginsEnabled = (true);
mWebView.LoadUrl (url);
}
class ViewClient : WebViewClient
{
Activity1 _activity;
public ViewClient(Activity1 activity)
{
_activity = activity;
}
public override void OnPageStarted (WebView view, string url, Android.Graphics.Bitmap favicon)
{
Console.WriteLine ("On Page Started");
}
public override void OnReceivedHttpAuthRequest (WebView view, HttpAuthHandler handler, string host, string realm)
{
Console.WriteLine ("On received Http auth request");
handler.Proceed("username", "password");
}
public override bool ShouldOverrideUrlLoading (WebView view, string url)
{
Console.WriteLine ("Should Override Url Loading...");
return base.ShouldOverrideUrlLoading (view, url);
}
}
}
The reason why your toasts aren't showing is probably because you're not calling ".Show()" on them so they are never displayed.
If you still can't get it up and running, then providing a URL we can use to hit against would be really useful.
I hope this helps,
ChrisNTR
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With