1

尝试在 Adob​​e Air 的 Android 应用程序的本机代码中启动活动时,我收到以下错误:

android.content.ActivityNotFoundException:找不到明确的活动类 {air.InAppPurchases/com.industrycorp.AndroidInAppPurchaseLib.AsyncActivity};您是否在 AndroidManifest.xml 中声明了此活动?

我一直在看许多教程和指南,但无法解决这个问题。

我的原生 AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.industrycorp.AndroidInAppPurchaseLib"
          android:versionCode="1"
          android:versionName="1.0">
    <uses-permission android:name="com.android.vending.BILLING" />
    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
        <activity android:name="ACTIVITY_ENTRY_NAME"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name=".IAPView.IAPListActivity"/>
        <activity android:name=".AsyncActivity" android:label="async_activity"/>
    </application>
</manifest>

我在 Air 端的 AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8" ?>

<!-- Adobe AIR Application Descriptor File Template.
     Specifies parameters for identifying, installing, and launching AIR applications.

     xmlns - The Adobe AIR namespace: http://ns.adobe.com/air/application/3.7.
     The last segment of the namespace specifies the version of the AIR runtime required for this application to run.

     minimumPatchLevel - The minimum patch level of the AIR runtime required to run the application. Optional. -->

<application xmlns="http://ns.adobe.com/air/application/3.7">

    <!-- A universally unique application identifier. Must be unique across all AIR applications.
         Using a reverse DNS-style name as the id is recommended. (Eg. com.example.ExampleApplication.) Required. -->
    <id>InAppPurchases</id>

    <!-- Used as the filename for the application. Required. -->
    <filename>InAppPurchases</filename>

    <!-- The name that is displayed in the AIR application installer. May have multiple values for each language. See samples or xsd schema file. Optional. -->
    <name>InAppPurchases</name>

    <!-- A string value of the format <0-999>.<0-999>.<0-999> that represents application version which can be used to check for application upgrade.
         Values can also be 1-part or 2-part. It is not necessary to have a 3-part value.
         An updated version of application must have a versionNumber value higher than the previous version. Required for namespace >= 2.5. -->
    <versionNumber>1.0.1</versionNumber>

    <!-- A string value (such as "v1", "2.5", or "Alpha 1") that represents the version of the application, as it should be shown to users. Optional. -->
    <!--<versionLabel></versionLabel>-->

    <!-- An application version designator (such as "v1", "2.5", or "Alpha 1"). Required for namespace < 2.5. -->
    <!--<version>0.0.0</version>-->

    <!-- Description, displayed in the AIR application installer. May have multiple values for each language. See samples or xsd schema file. Optional. -->
    <!--<description></description>-->

    <!-- Copyright information. Optional -->
    <!--<copyright></copyright>-->

    <!-- Publisher ID. Used if you're updating an application created prior to 1.5.3 -->
    <!--<publisherID></publisherID>-->

    <!-- Identifies the ActionScript extensions used by an application. -->
    <extensions>
        <extensionID>com.industrycorp.extensions</extensionID>
    </extensions>

    <!-- Settings for the application's initial window. Required. -->
    <initialWindow>
        <!-- The main SWF or HTML file of the application. Required. -->
        <content>InAppPurchases.swf</content>

        <!-- The title of the main window. Optional. -->
        <!--<title></title>-->

        <!-- The type of system chrome to use (either "standard" or "none"). Optional. Default standard. -->
        <!--<systemChrome></systemChrome>-->

        <!-- Whether the window is transparent. Only applicable when systemChrome is none. Optional. Default false. -->
        <!--<transparent></transparent>-->

        <!-- Whether the window is initially visible. Optional. Default false. -->
        <visible>true</visible>

        <!-- Whether the user can minimize the window. Optional. Default true. -->
        <!--<minimizable></minimizable>-->

        <!-- Whether the user can maximize the window. Optional. Default true. -->
        <!--<maximizable></maximizable>-->

        <!-- Whether the user can resize the window. Optional. Default true. -->
        <!--<resizable></resizable>-->

        <!-- The window's initial width in pixels. Optional. -->
        <!--<width></width>-->

        <!-- The window's initial height in pixels. Optional. -->
        <!--<height></height>-->

        <!-- The window's initial x position. Optional. -->
        <!--<x></x>-->

        <!-- The window's initial y position. Optional. -->
        <!--<y></y>-->

        <!-- The window's minimum size, specified as a width/height pair in pixels, such as "400 200". Optional. -->
        <!--<minSize></minSize>-->

        <!-- The window's initial maximum size, specified as a width/height pair in pixels, such as "1600 1200". Optional. -->
        <!--<maxSize></maxSize>-->

        <!-- The aspect ratio of the app ("portrait" or "landscape" or "any"). Optional. Mobile only. Default is the natural orientation of the device -->
        <!--<aspectRatio></aspectRatio>-->

        <!-- Whether the app will begin auto-orienting on launch. Optional. Mobile only. Default false -->
        <autoOrients>true</autoOrients>

        <!-- Whether the app launches in full screen. Optional. Mobile only. Default false -->
        <fullScreen>true</fullScreen>

        <!-- The render mode for the app (either auto, cpu, gpu, or direct). Optional. Default auto -->
        <!--<renderMode></renderMode>-->

        <!-- Whether the default direct mode rendering context allocates storage for depth and stencil buffers.  Optional.  Default false. -->
        <!--<depthAndStencil></depthAndStencil>-->

        <!-- Whether or not to pan when a soft keyboard is raised or lowered (either "pan" or "none").  Optional.  Defaults "pan." -->
        <!--<softKeyboardBehavior></softKeyboardBehavior>-->

        <!-- Display Resolution for the app (either "standard" or "high"). Optional, OSX-only. Default "standard" -->
        <!-- <requestedDisplayResolution></requestedDisplayResolution> -->
    </initialWindow>

    <!-- We recommend omitting the supportedProfiles element, which in turn permits your application to be deployed to all devices supported by AIR.
         If you wish to restrict deployment (i.e., to only mobile devices) then add this element and list only the profiles which your application does support. -->
    <!--<supportedProfiles>desktop extendedDesktop mobileDevice extendedMobileDevice</supportedProfiles>-->

    <!-- Languages supported by application. Only these languages can be specified -->
    <!--<supportedLanguages>en de cs es fr it ja ko nl pl pt ru sv tr zh</supportedLanguages>-->

    <!-- The subpath of the standard default installation location to use. Optional. -->
    <!--<installFolder></installFolder>-->

    <!-- The subpath of the Programs menu to use. (Ignored on operating systems without a Programs menu.) Optional. -->
    <!--<programMenuFolder></programMenuFolder>-->

    <!-- The icon the system uses for the application. For at least one resolution, specify the path to a PNG file included in the AIR package. Optional. -->
    <!--<icon>
        <image16x16></image16x16>
        <image29x29></image29x29>
        <image32x32></image32x32>
        <image36x36></image36x36>
        <image48x48></image48x48>
        <image50x50></image50x50>
        <image57x57></image57x57>
        <image58x58></image58x58>
        <image72x72></image72x72>
        <image96x96></image96x96>
        <image100x100></image100x100>
        <image114x114></image114x114>
        <image128x128></image128x128>
        <image144x144></image144x144>
        <image512x512></image512x512>
        <image732x412></image732x412>
        <image1024x1024></image1024x1024>
    </icon>-->

    <!-- Whether the application handles the update when a user double-clicks an update version of the AIR file (true),
         or the default AIR application installer handles the update (false). Optional. Default false. -->
    <!--<customUpdateUI></customUpdateUI>-->

    <!-- Whether the application can be launched when the user clicks a link in a web browser. Optional. Default false. -->
    <!--<allowBrowserInvocation></allowBrowserInvocation>-->

    <!-- Listing of file types for which the application can register. Optional. -->
    <!--<fileTypes>-->
    <!-- Defines one file type. Optional. -->
    <!--<fileType>-->
    <!-- The name that the system displays for the registered file type. Required. -->
    <!--<name></name>-->
    <!-- The extension to register. Required. -->
    <!--<extension></extension>-->
    <!-- The description of the file type. Optional. -->
    <!--<description></description>-->
    <!-- The MIME content type. -->
    <!--<contentType></contentType>-->
    <!-- The icon to display for the file type. Optional. -->
    <!--<icon>
        <image16x16></image16x16>
        <image32x32></image32x32>
        <image48x48></image48x48>
        <image128x128></image128x128>
    </icon>-->
    <!--</fileType>-->
    <!--</fileTypes>-->

    <!-- iOS specific capabilities -->
    <!--<iPhone>-->
        <!-- A list of plist key/value pairs to be added to the application Info.plist -->
        <!--<InfoAdditions>-->
            <!--<![CDATA[-->
            <!--<key>UIDeviceFamily</key>-->
            <!--<array>-->
                <!-- iPhone and iPod touch devices -->
                <!--<string>1</string>-->
                <!-- iPad devices -->
                <!--<string>2</string>-->
            <!--</array>-->
            <!--<key>UIStatusBarStyle</key>-->
            <!--<string>UIStatusBarStyleBlackOpaque</string>-->
            <!--<key>UIRequiresPersistentWiFi</key>-->
            <!--<string>YES</string>-->
            <!--]]>-->
        <!--</InfoAdditions>-->

        <!-- A list of plist key/value pairs to be added to the application Entitlements.plist -->
        <!--<Entitlements>
            <![CDATA[
            <key>keychain-access-groups</key>
            <array>
                <string></string>
                <string></string>
            </array>
            ]]>
        </Entitlements>-->

        <!-- Display Resolution for the app (either "standard" or "high"). Optional. Default "standard" -->
        <!--<requestedDisplayResolution>high</requestedDisplayResolution>-->
        <!-- Forcing Render Mode CPU for the devices mentioned. Optional  -->
        <!--<forceCPURenderModeForDevices></forceCPURenderModeForDevices> -->
        <!-- File containing line separated list of external swf paths. These swfs won't be packaged inside the application
        and corresponding stripped swfs will be output in externalStrippedSwfs folder. -->
        <!--<externalSwfs></externalSwfs> -->
    <!--</iPhone>-->

    <!-- Android specific tags that get passed to AndroidManifest.xml file. -->
    <android>

        <manifestAdditions>

            <![CDATA[
            <manifest android:installLocation="auto">
                <uses-permission android:name="android.permission.INTERNET"/>
                <!--<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>-->
                <!--<uses-permission android:name="android.permission.READ_PHONE_STATE"/>-->
                <!--<uses-permission android:name="android.permission.VIBRATE"/>-->
                <!--<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>-->
                <!--<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>-->
                <!--<uses-permission android:name="android.permission.WAKE_LOCK"/>-->
                <!--<uses-permission android:name="android.permission.CAMERA"/>-->
                <!--<uses-permission android:name="android.permission.RECORD_AUDIO"/>-->
                <!--<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>-->
                <!--<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>-->
                <uses-permission android:name="com.android.vending.BILLING"/>

                <!--<uses-feature android:required="true" android:name="android.hardware.touchscreen.multitouch"/>-->
                <application android:enabled="true">

                    <activity android:excludeFromRecents="false">
                        <intent-filter>
                            <action android:name="android.intent.action.MAIN"/>
                            <category android:name="android.intent.category.LAUNCHER"/>
                        </intent-filter>
                    </activity>
                    <activity android:name=".AsyncActivity" android:label="async_activity"/>
                </application>
            </manifest>
            ]]>
            </manifestAdditions>


        <!-- Color depth for the app (either "32bit" or "16bit"). Optional. Default 16bit before namespace 3.0, 32bit after -->
        <!--<colorDepth></colorDepth>-->
        <!-- Indicates if the app contains video or not. Necessary for ordering of video planes with graphics plane, especially in Jellybean - if you app does video this must be set to true - valid values are true or false -->
        <!-- <containsVideo></containsVideo> -->
    </android>

</application>

我的活动课:

public class AsyncActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        IAPManager.getInstance().getContext().dispatchStatusEventAsync("message", "This shit b cray cray");
        IAPManager.getInstance().makePurchase(this);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        // Pass on the activity result to the helper for handling
        Log.d("IAPManager", "Shit is about to hit the fan");
        if (!IAPManager.getInstance().getHelper().handleActivityResult(requestCode, resultCode, data)) {
            // not handled, so handle it ourselves (here's where you'd
            // perform any handling of activity results not related to in-app
            // billing...
            super.onActivityResult(requestCode, resultCode, data);
        }
    }

    @Override
    public void onDestroy() {
        IAPManager.getInstance().endPurchase(this);
        super.onDestroy();
    }
}

在 Java 代码中初始化我的活动:

Intent intent = new Intent(context.getActivity(), AsyncActivity.class);
context.getActivity().startActivity(intent);
4

2 回答 2

2

我也有同样的例外。我找到了一个解决方案,方法是使用与先前答案中所述相同的完全限定名称(在 AIR 的 manifestAdditions 中):

包括我在 Java 中看到的类的完全限定名
并通过不同的方式开始活动:

Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClassName("com.industrycorp.AndroidInAppPurchaseLib", "com.industrycorp.AndroidInAppPurchaseLib.AsyncActivity");
context.getActivity().startActivity(intent);
于 2014-05-13T08:16:35.477 回答
1

所以我发现扩展中根本没有使用原生的AndroidManifest.xml,只有AIR中使用的那个。

我的问题的答案只是包含我的类的完全限定名称,正如它在 Java 中看到的那样:

不正确:

<activity android:name=".AsyncActivity"/>

正确的:

<activity android:name="com.industrycorp.AndroidInAppPurchaseLib.AsyncActivity"/> 
于 2013-08-14T15:04:09.663 回答