Android 应用程序快捷方式在较低 Android 版本中损坏

Android App Shortcuts Broke in Lower Android Versions

今天,我正在制作一个应用程序,其中包含最新的 Android 7.1 功能,应用程序快捷方式。起初,它 运行 在 Android 7.1.1 上运行良好。但是,当我在 Android M 上的 MIUI 8 上 运行 时,不幸的是它坏了。我写了一些东西让它在 M 或更低版本上成为 运行,但它又坏了。我很困惑。我希望有人能给我一个解决这个问题的方法。如果有人可以帮助我,我将不胜感激。不管怎么说,还是要谢谢你!

这是我的代码。

findViewById(R.id.textView5).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            addshortcut();
        }
    });
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        shortcutManager = getSystemService(ShortcutManager.class);
    }


public void addshortcut(){
    TextView textView = (TextView)findViewById(R.id.textView5);
    String name = textView.getText().toString();
    ShortcutInfo dynamicShortcut = null;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
        dynamicShortcut = new ShortcutInfo.Builder(this, "shortcut_dynamic-zty")
                .setShortLabel(name)
                .setLongLabel(name)
                .setIcon(Icon.createWithResource(this,R.drawable.ic_account_circle))
                .setIntents(
                        new Intent[]{
                                new Intent(Intent.ACTION_VIEW, Uri.EMPTY,com.zengtianyu.gallery1.DetailZTY.this, DetailZTY.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK),
                        })
                .build();
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
        shortcutManager.setDynamicShortcuts(Arrays.asList(dynamicShortcut));
    }
    Toast.makeText(this,"添加成功",Toast.LENGTH_SHORT).show();
}

这是日志。

java.lang.NoClassDefFoundError: Failed resolution of:Landroid/content/pm/ShortcutManager;
at com.zengtianyu.gallery1.DetailLSW.onCreate(DetailLSW.java:88)
at android.app.Activity.performCreate(Activity.java:6323)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2411)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2518)
at android.app.ActivityThread.access00(ActivityThread.java:153)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1382)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:5544)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:102)
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.content.pm.ShortcutManager" on path: DexPathList[[zip file "/data/app/com.zengtianyu.gallery1-1/base.apk"],nativeLibraryDirectories=[/data/app/com.zengtianyu.gallery1-1/lib/arm64, /vendor/lib64, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
... 14 more
Suppressed: java.lang.ClassNotFoundException: Didn't find class "android.content.pm.ShortcutManager" on path: DexPathList[[dex file "/data/dalvik-cache/xposed_XResourcesSuperClass.dex"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]
 at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
 ... 15 more
 Suppressed: java.lang.ClassNotFoundException:android.content.pm.ShortcutManager
  at java.lang.Class.classForName(Native Method)
  at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
  at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
  ... 16 more
 Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

您传递的是 ShortcutManager.class 而不是字符串常量 SHORTCUT_SERVICE 将第 8 行更改为以下内容:

shortcutManager = (ShortcutManager)getSystemService(SHORTCUT_SERVICE);

如果您希望支持旧的 android 版本,请不要将 shortcutManager 设为全局变量,而是在 addShortcut() 函数中创建它,并将该函数的用法包装在 sdk 版本在线检查中7
所以你最终应该得到:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    addShortcut();
}
...
public void addShortcut(){
    ShortcutManager shortcutManager = (ShortcutManager)getSystemService(SHORTCUT_SERVICE);
    ...
}