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);
...
}
今天,我正在制作一个应用程序,其中包含最新的 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);
...
}