java.lang.RuntimeException:无法启动活动ComponentInfo {...}:java.lang.ClassCastException:android.app.Application无法强制转换为

时间:2013-02-08 10:58:07

标签: android classcastexception runtimeexception

我正在创建一个使用Microsoft Hawaii OCR的Android应用程序;在我的应用程序测试期间,它崩溃给我这个错误:

02-08 11:38:38.861: E/AndroidRuntime(4704): FATAL EXCEPTION: main
02-08 11:38:38.861: E/AndroidRuntime(4704): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mobile/com.example.mobile.RecognitionActivity}: java.lang.ClassCastException: android.app.Application cannot be cast to microsoft.hawaii.sampleappbase.HawaiiBaseApplication
02-08 11:38:38.861: E/AndroidRuntime(4704):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1960)
02-08 11:38:38.861: E/AndroidRuntime(4704):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1985)
02-08 11:38:38.861: E/AndroidRuntime(4704):     at android.app.ActivityThread.access$600(ActivityThread.java:127)
02-08 11:38:38.861: E/AndroidRuntime(4704):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1151)
02-08 11:38:38.861: E/AndroidRuntime(4704):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-08 11:38:38.861: E/AndroidRuntime(4704):     at android.os.Looper.loop(Looper.java:137)
02-08 11:38:38.861: E/AndroidRuntime(4704):     at android.app.ActivityThread.main(ActivityThread.java:4476)
02-08 11:38:38.861: E/AndroidRuntime(4704):     at java.lang.reflect.Method.invokeNative(Native Method)
02-08 11:38:38.861: E/AndroidRuntime(4704):     at java.lang.reflect.Method.invoke(Method.java:511)
02-08 11:38:38.861: E/AndroidRuntime(4704):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:816)
02-08 11:38:38.861: E/AndroidRuntime(4704):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:583)
02-08 11:38:38.861: E/AndroidRuntime(4704):     at dalvik.system.NativeStart.main(Native Method)
02-08 11:38:38.861: E/AndroidRuntime(4704): Caused by: java.lang.ClassCastException: android.app.Application cannot be cast to microsoft.hawaii.sampleappbase.HawaiiBaseApplication
02-08 11:38:38.861: E/AndroidRuntime(4704):     at microsoft.hawaii.sampleappbase.HawaiiBaseAuthActivity.getBaseApplication(HawaiiBaseAuthActivity.java:204)
02-08 11:38:38.861: E/AndroidRuntime(4704):     at microsoft.hawaii.sampleappbase.HawaiiBaseAuthActivity.getAuthenticationTypeFromApp(HawaiiBaseAuthActivity.java:117)
02-08 11:38:38.861: E/AndroidRuntime(4704):     at microsoft.hawaii.sampleappbase.HawaiiBaseAuthActivity.onCreate(HawaiiBaseAuthActivity.java:52)
02-08 11:38:38.861: E/AndroidRuntime(4704):     at com.example.mobile.RecognitionActivity.onCreate(RecognitionActivity.java:32)
02-08 11:38:38.861: E/AndroidRuntime(4704):     at android.app.Activity.performCreate(Activity.java:4636)
02-08 11:38:38.861: E/AndroidRuntime(4704):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1051)
02-08 11:38:38.861: E/AndroidRuntime(4704):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1924)
02-08 11:38:38.861: E/AndroidRuntime(4704):     ... 11 more

错误是指导入的项目,特别是此代码:

package microsoft.hawaii.sampleappbase;

import microsoft.hawaii.hawaiiClientLibraryBase.Identities.ClientIdentity;
import microsoft.hawaii.hawaiiClientLibraryBase.Util.Utility;
import microsoft.hawaii.sampleappbase.HawaiiBaseApplication.AuthenticationType;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.widget.Toast;

/**
 * Base Activity for Hawaii authentication
 */
public class HawaiiBaseAuthActivity extends Activity {

/**
 * Error code for missing authentication type in configuration file
 */
static final int MISSING_NETWORK_CONNECTION = 0;

/**
 * Error code for missing authentication value in configuration file
 */
static final int MISSING_AUTHENTICATION_TYPE = 1;

/**
 * Error code for missing authentication value in configuration file
 */
static final int MISSING_AUTHENTICATION_VALUES = 2;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    if (networkInfo == null || !networkInfo.isConnected()) {
        this.showDialog(MISSING_NETWORK_CONNECTION);
        return;
    }

    if (!this.shouldAuthenticate()) {
        return;
    }

    AuthenticationType authType = this.getAuthenticationTypeFromApp();
    if (authType == AuthenticationType.NOVALUE) {
        this.showDialog(MISSING_AUTHENTICATION_TYPE);
        return;
    }

    // create ClientIdentity object based on configured Hawaii client
    // credential
    ClientIdentity identity = null;
    try {
        switch (authType) {
        case GUID:
            String appId = this.getString(R.string.hawaii_GUID_app_ID);
            if (Utility.isStringNullOrEmpty(appId)) {
                this.showDialog(MISSING_AUTHENTICATION_VALUES);
                return;
            }

            identity = ClientIdentity.createClientIdentity(appId);
            break;
        case ADM:
            String clientId = this.getString(R.string.hawaii_ADM_client_ID);
            String clientSecret = this
                    .getString(R.string.hawaii_ADM_client_secret);
            String serviceScope = this
                    .getString(R.string.hawaii_ADM_service_scope);

            if (Utility.isStringNullOrEmpty(clientId)
                    || Utility.isStringNullOrEmpty(clientSecret)
                    || Utility.isStringNullOrEmpty(serviceScope)) {
                this.showDialog(MISSING_AUTHENTICATION_VALUES);
                return;
            }
            identity = ClientIdentity.createClientIdentity(clientId,
                    clientSecret, serviceScope);
            break;
        case NOVALUE:
            this.showErrorMessage(
                    "Couldn't configure client identity for calling Hawaii service",
                    null);
            return;
        }
    } catch (Exception exception) {
        this.showErrorMessage(
                "Couldn't configure client identity for calling Hawaii service",
                exception);
    }

    if (identity != null) {
        this.getBaseApplication().setClientIdentity(identity);
    } else {
        this.showErrorMessage(
                "Couldn't configure client identity for calling Hawaii service",
                null);
    }
}

/**
 * 
 * getAuthenticationTypeFromApp Return authentication type which assigned by
 * application
 * 
 * @return AuthenticationType
 */
protected AuthenticationType getAuthenticationTypeFromApp() {
    return this.getBaseApplication().getAuthType();
}

/**
 * Return a flag to indicate whether current Activity needs authentication
 * 
 * @return boolean
 */
protected boolean shouldAuthenticate() {
    return true;
}

/**
 * show ErrorMessage using AlertDialog
 * 
 * @param title
 *            title to display on the dialog
 * @param exception
 *            exception to display on the dialog
 */
protected void showErrorMessage(String title, Throwable exception) {
    if (exception != null) {
        exception.printStackTrace();
        System.out.println(exception.toString());
    }

    AlertDialog dialog = dialogToShow(title, exception).create();
    dialog.setCanceledOnTouchOutside(true);
    dialog.show();
}

/**
 * show ErrorMessage using AlertDialog
 * 
 * @param title
 *            title to display on the dialog
 * @param exception
 *            exception to display on the dialog
 */
protected void showErrorMessage(AlertDialog.Builder builder) {
    if (builder == null) {
        return;
    }

    AlertDialog dialog = builder.create();
    dialog.setCanceledOnTouchOutside(true);
    dialog.show();
}

/**
 * show specified message in toast
 * 
 * @param message
 *            specified message
 */
protected void showMessage(String message) {
    if (!Utility.isStringNullOrEmpty(message)) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }
}

/**
 * create a {@link AlertDialog.Builder} to show dialog
 * 
 * @param title
 *            title to display on the dialog
 * @param exception
 *            exception to display on the dialog
 * @return AlertDialog.Builder
 */
protected AlertDialog.Builder dialogToShow(String title, Throwable exception) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(title);
    if (exception != null) {
        builder.setMessage(exception.getLocalizedMessage());
    }

    builder.setCancelable(true);
    return builder;
}

/**
 * gets current {@link HawaiiBaseApplication} object
 * 
 * @return HawaiiBaseApplication
 */
protected HawaiiBaseApplication getBaseApplication() {
    return (HawaiiBaseApplication) this.getApplication();
}

@Override
protected Dialog onCreateDialog(int id) {
    AlertDialog dialog = new AlertDialog.Builder(this).create();
    dialog.setTitle(getString(R.string.configuration_error_title));
    dialog.setCanceledOnTouchOutside(true);
    dialog.setCancelable(true);

    String errorMessage = this.getErrorMessage(id);
    dialog.setMessage(errorMessage);

    final Activity activity = this;
    dialog.setOnCancelListener(new OnCancelListener() {
        public void onCancel(DialogInterface dialog) {
            activity.finish();
        }
    });

    return dialog;
}

protected String getErrorMessage(int id) {
    switch (id) {
    case MISSING_NETWORK_CONNECTION:
        return getString(R.string.error_missing_network_connection);
    case MISSING_AUTHENTICATION_TYPE:
        return getString(R.string.error_missing_authentication_type);
    case MISSING_AUTHENTICATION_VALUES:
        return getString(R.string.error_missing_authentication_value);
    default:
        return null;
    }
}
}

这是HawaiiBaseApplication的代码

/**
 * Copyright (c) Microsoft Corporation. All rights reserved.
 */
package microsoft.hawaii.sampleappbase;

import microsoft.hawaii.hawaiiClientLibraryBase.Identities.ClientIdentity;
import android.app.Application;

/**
 * Base application class for Hawaii sample applications
 */
public class HawaiiBaseApplication extends Application {

/**
 * Hawaii authentication type
 */
private AuthenticationType authType;

/**
 * ClientIdentity object
 */
private ClientIdentity identity;

/**
 * Enum class to represent Hawaii authentication type
 */
public enum AuthenticationType {
    GUID, ADM, NOVALUE;

    /**
     * Convert to authentication type enum for specified String
     * 
     * @param str
     *            specified String
     * @return AuthenticationType
     */
    public static AuthenticationType convertToAuthType(String str) {
        try {
            return valueOf(str.toUpperCase());
        } catch (Exception ex) {
            return NOVALUE;
        }
    }
}

/**
 * Gets current authentication type
 * 
 * @return AuthenticationType
 */
public AuthenticationType getAuthType() {
    if (authType == null) {
        authType = AuthenticationType
                .convertToAuthType(getString(R.string.hawaii_authentication_type));
    }

    return authType;
}

/**
 * Gets current ClientIdentity object
 * 
 * @return ClientIdentity
 */
public ClientIdentity getClientIdentity() {
    return this.identity;
}

/**
 * Sets current ClientIdentity object
 * 
 * @param identity
 *            current ClientIdentity object
 */
public void setClientIdentity(ClientIdentity identity) {
    this.identity = identity;
}

}
是的,有人可以帮帮我吗?我陷入了这一点,我不知道它有什么问题..

非常感谢你!

1 个答案:

答案 0 :(得分:0)

您的application元素在android:name="microsoft.hawaii.sampleappbase.HawaiiBaseApplication"中是否具有AndroidManifest.xml属性?这可能是缺少的。

http://developer.android.com/guide/topics/manifest/application-element.html