主屏幕应用程序快捷方式不适用于 android。未安装应用程序

Posted

技术标签:

【中文标题】主屏幕应用程序快捷方式不适用于 android。未安装应用程序【英文标题】:home screen app shortcut is not working android. app isn't installed 【发布时间】:2014-02-27 19:51:34 【问题描述】:

我在主屏幕上创建了应用快捷方式。但它不工作。它总是显示吐司app isn't installed。我尝试了 2 种不同的代码,但结果始终相同。

这是第一个代码

private void addShortcut() 
        // Adding shortcut on Home screen
        Intent shortcutIntent = new Intent(getApplicationContext(), MainActivity.class);
        shortcutIntent.setAction(Intent.ACTION_MAIN);
        Intent addIntent = new Intent();
        addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
        addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "AppName");
        addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
                Intent.ShortcutIconResource.fromContext(
                        getApplicationContext(), R.drawable.ic_launcher));
        addIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
        getApplicationContext().sendBroadcast(addIntent);
    

第二个代码

public static void addShortcut(Context context)
    
        Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");

        ApplicationInfo appInfo = context.getApplicationInfo();

        // Shortcut name
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, "appInfo.name");
        shortcut.putExtra("duplicate", false); // Just create once

        // Setup activity shoud be shortcut object 
        ComponentName component = new ComponentName(appInfo.packageName, "MainActivity.class");
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(component));

        // Set shortcut icon
        ShortcutIconResource iconResource = Intent.ShortcutIconResource.fromContext(context, appInfo.icon);
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);

        context.sendBroadcast(shortcut);
    

记录猫和清单:

    02-03 22:36:58.625: E/memtrack(1697): Couldn't load memtrack module (No such file or directory)
    02-03 22:36:58.625: E/android.os.Debug(1697): failed to load memtrack module: -2
    02-03 22:37:02.515: E/memtrack(1708): Couldn't load memtrack module (No such file or directory)
    02-03 22:37:02.515: E/android.os.Debug(1708): failed to load memtrack module: -2
    02-03 22:37:03.255: E/InputDispatcher(388): channel 'b500ff48 com.example.test_shortcut/com.example.test_shortcut.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
    02-03 22:37:13.805: E/WindowManager(388): Starting window AppWindowTokenb5537500 token=Tokenb50334a8 ActivityRecordb502b0e0 u0 com.example.test_shortcut/.MainActivity t7 timed out



<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test_shortcut"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.test_shortcut.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name="com.example.test_shortcut.PackageReplacedReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REPLACED" />

                <data
                    android:path="com.example.test_shortcut"
                    android:scheme="com.example" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

我已经在模拟器上用 api 18 和平板电脑上用 android 4.2 试用过我的应用

任何帮助将不胜感激。 谢谢

【问题讨论】:

别告诉我们吐司说什么。向我们展示 logcat 的内容。 我已经添加了 logcat。你可以检查一下 谢谢,请同时发布您的清单。我感觉错误与您的包名称或您在清单中引用事物的方式有关。顺便问一下,你用的是什么IDE? Eclipse 还是 Android Studio?我的重构说明会根据您使用的不同而略有不同。 我已经添加了完整的清单文件。我正在使用日食。谢谢 【参考方案1】:

在我的情况下添加

android:exported="true"

要从启动器调用的 MainActivity 工作。 如果有帮助的话。

【讨论】:

【参考方案2】:

您可能需要:

<uses-permission android:name="android.permission.BROADCAST_PACKAGE_REPLACED" />

同时替换:

 <intent-filter>
       <action android:name="android.intent.action.PACKAGE_REPLACED" />
       <data
                android:path="com.example.test_shortcut"
                android:scheme="com.example" />
 </intent-filter>

与:

 <intent-filter android:priority="999">
       <action android:name="android.intent.action.PACKAGE_REPLACED" />
       <data android:scheme="com.example.test_shortcut" />
 </intent-filter> 

我还没有实际测试过,让我知道它现在是否有效。使用您自己的自定义包名称来避免与现有应用程序发生冲突也没有什么坏处,而不是使用以com.example 开头的默认包名称,该名称用于 Android 上的大多数示例、演示和教程。

【讨论】:

是的,现在第一个代码可以正常工作。谢谢

以上是关于主屏幕应用程序快捷方式不适用于 android。未安装应用程序的主要内容,如果未能解决你的问题,请参考以下文章

从主屏幕快捷方式启动时,应用程序未安装错误

在我的 Android 主屏幕上列出快捷方式 [重复]

Android主屏幕快捷方式权限错误

如何在Android模拟器中将应用程序的快捷方式添加到主屏幕

如何通过主屏幕上的快捷方式启动 Android Python 脚本

如何在应用安装时将我的应用快捷方式添加到主屏幕? [复制]