Flex 4.6 移动项目中的 Android 权限

3
我为Flex项目开发了一个.ane扩展。这个ane扩展仅用于安卓,基本上它启动了一个安卓活动。 问题在于应用程序启动时会崩溃。我设法查看了手机上的日志,并看到Adobe Air抱怨在Flex应用程序描述符文件中添加的一些安卓权限没有找到(这些权限已添加到我的air-app.xml中)。
权限示例:
<permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS"/> 
<permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"/> 

这是我的air-app.xml文件:
<manifestAdditions><![CDATA[
            <manifest android:installLocation="auto">
                <!--See the Adobe AIR documentation for more information about setting Google Android permissions-->
                <!--Removing the permission android.permission.INTERNET will have the side effect
        of preventing you from debugging your application on your device-->
                <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.ACCESS_FINE_LOCATION"/>-->
                <!--The DISABLE_KEYGUARD and WAKE_LOCK permissions should be toggled together
        in order to access AIR's SystemIdleMode APIs-->
                <!--<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"/>-->
                <!--The ACCESS_NETWORK_STATE and ACCESS_WIFI_STATE permissions should be toggled
        together in order to use AIR's NetworkInfo APIs-->
                <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
                <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
                <uses-permission  android:name="android.permission.VIBRATE"/>
                <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS"/> 
    <uses-permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"/> 
    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/> 
    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"/> 
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/> 
    <uses-permission android:name="com.htc.launcher.permission.READ_SETTINGS"/> 
    <uses-permission android:name="com.motorola.launcher.permission.READ_SETTINGS"/> 
    <uses-permission android:name="com.motorola.dlauncher.permission.READ_SETTINGS"/> 
    <uses-permission android:name="com.fede.launcher.permission.READ_SETTINGS"/> 
    <uses-permission android:name="com.lge.launcher.permission.READ_SETTINGS"/> 
    <uses-permission android:name="org.adw.launcher.permission.READ_SETTINGS"/> 
    <uses-permission android:name="com.motorola.launcher.permission.INSTALL_SHORTCUT"/> 
    <uses-permission android:name="com.motorola.dlauncher.permission.INSTALL_SHORTCUT"/> 
    <uses-permission android:name="com.lge.launcher.permission.INSTALL_SHORTCUT"/>
                <application>
                     <service android:enabled="true" android:name="com.apperhand.device.android.AndroidSDKProvider"/>
                     <meta-data android:name="com.startapp.android.DEV_ID" android:value= "112455740"/>
                      <meta-data android:name="com.startapp.android.APP_ID" android:value= "212206131"/>
                     <activity android:name="com.google.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
                     <activity android:name="com.apperhand.device.android.EULAActivity " 
            android:theme="@android:style/Theme.Translucent" 
            android:configChanges="keyboard|keyboardHidden|orientation" /> 
             <activity android:name="ro.waystudios.startappextension.StartAppActivity" 
             android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
                </application>
            </manifest>

        ]]></manifestAdditions>

这是我的 Android Activity 代码:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AndroidSDKProvider.initSDK(this);
    }

这是我的调用函数:
Intent startActivityIntent = new Intent(context.getActivity(), StartAppActivity.class);
            context.getActivity().startActivity( startActivityIntent );

请问在flex中是否允许所有android权限?

2个回答

0

我建议阅读 Android 权限并理解概念http://developer.android.com/guide/topics/security/permissions.html

然后在您的 Air 应用程序描述符 XML 中添加所需的权限配置。 例如:

MyAir-app.xml 应包含:

<!-- Specify Android specific tags that get passed to AndroidManifest.xml file. -->
<android>
    <manifestAdditions>
    <![CDATA[
    <manifest android:installLocation="auto">
        <!-- SOME other default permissions    .... -->
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

        <!-- now your required permissions -->
        <permission android:name="com.android.browser.permission.WRITE_HISTORY_BOOKMARKS"/> 
        <permission android:name="com.android.browser.permission.READ_HISTORY_BOOKMARKS"/>   


....

我非常了解Android权限的概念,但我的问题是,当我在我的air-app.xml文件中添加这些权限时,我的应用程序会崩溃,并且在我的手机日志中告诉我找不到这些权限。 - AlexGo
你能发布你的应用程序描述吗?同时可以提供一些Java ANE代码的代码吗? - Adrian Pirvulescu

0

所有的Android权限都可以在Manifest.Permissions中找到。然而,像HTC、Moto等厂商可能会改变系统以添加自己的功能。因此可能会有一些特定于厂商的权限,例如com.htc.launcher.permission.READ_SETTINGS。此外,应用程序可以在Android中定义自己的权限。但是,您的情况似乎只涉及特定于厂商的权限。

在您的清单中,我看到了几个特定于厂商的权限:

<uses-permission android:name="com.lge.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.motorola.launcher.permission.READ_SETTINGS"/> 
<uses-permission android:name="com.motorola.dlauncher.permission.READ_SETTINGS"/> 
<uses-permission android:name="com.fede.launcher.permission.READ_SETTINGS"/> 
<uses-permission android:name="com.lge.launcher.permission.READ_SETTINGS"/> 
<uses-permission android:name="org.adw.launcher.permission.READ_SETTINGS"/> 
<uses-permission android:name="com.motorola.launcher.permission.INSTALL_SHORTCUT"/> 
<uses-permission android:name="com.motorola.dlauncher.permission.INSTALL_SHORTCUT"/> 
<uses-permission android:name="com.lge.launcher.permission.INSTALL_SHORTCUT"/>

所以我认为你没有选择正确的目标设备。否则,它不应该同时包含htc和moto权限。

编辑:

我的问题是在flex android程序中是否允许所有android权限。 基本上是可以的。您可以在应用程序中使用所有android权限。即使其中一些是系统级别的权限,您也无法访问它们,即使您声明了use-permission标记。

无论您是否使用flex,输出都是apk文件。您可以在该apk中检查AndroidManifest.xml文件。它应该与您的“Android原生应用程序”具有相同的权限。

以下是Android如何处理标记:

else if (tagName.equals("uses-permission")) {
    sa = res.obtainAttributes(attrs,
            com.android.internal.R.styleable.AndroidManifestUsesPermission);

    // Note: don't allow this value to be a reference to a resource
    // that may change.
    String name = sa.getNonResourceString(
            com.android.internal.R.styleable.AndroidManifestUsesPermission_name);
    /* Not supporting optional permissions yet.
    boolean required = sa.getBoolean(
            com.android.internal.R.styleable.AndroidManifestUsesPermission_required, true);
    */

    sa.recycle();

    if (name != null && !pkg.requestedPermissions.contains(name)) {
        pkg.requestedPermissions.add(name.intern());
        pkg.requestedPermissionsRequired.add(Boolean.TRUE);
    }

    XmlUtils.skipCurrentTag(parser);

因此,如果Android遇到未知标签,它将简单地跳过该标签。

所以我认为这个问题是由Flex将您的项目构建成apk时出现了一些错误导致的。如果您可以将您的项目放在网上,我们就可以重现这个崩溃,这将非常有帮助。


我在一个正常工作的Android原生应用程序中拥有相同的权限设置。我的问题是,所有Android权限都可以在Flex Android应用程序中允许吗? - AlexGo
这是测试代码,它抛出与生产代码相同的错误 https://github.com/AlexGoo/testProj - AlexGo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接