简体   繁体   中英

home screen app shortcut is not working android. app isn't installed

I have created app shortcut on home screen. but Its not working. it always shows the toast app isn't installed . I have tried 2 different codes but the result is always same.

Here is the first code

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);
    }

Second code

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);
    }

Log cat and manifest:

    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 AppWindowToken{b5537500 token=Token{b50334a8 ActivityRecord{b502b0e0 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>

I have tried my app at emulator with api 18 and at tablet with android 4.2

Any help will be appreciated. Thanks

In my case adding

android:exported="true"

to MainActivity to be called from launcher worked. If it helps.

You may need:

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

Also replace:

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

With:

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

I haven't actually tested this, let me know if it works now. It also wouldn't hurt to use your own custom package name to avoid conflicts with existing apps, instead of using the default package name, that starts with com.example , that's used for most examples, demos, and tutorials on Android.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM