2017-08-04 5 views
0

Aujourd'hui, je faisais une application avec la nouvelle fonctionnalité Android 7.1, App Shortcuts. Au début, il fonctionne bien sur Android 7.1.1. Cependant, quand je l'ai fait fonctionner sur MIUI 8 sur Android M, il a malheureusement cassé. J'ai écrit quelque chose pour le faire fonctionner sur M ou version inférieure, mais il a cassé à nouveau. J'étais confus. J'espère que quelqu'un peut me donner une solution à ce problème. Je serai apprécié si quelqu'un peut m'aider. Merci quand même!Android raccourcis App Broken dans les versions Android inférieures

Voici mon code.

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

Voici le journal.

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.access$1000(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 

Répondre

1

Vous passez ShortcutManager.class au lieu de la chaîne constante SHORTCUT_SERVICE ligne de changement 8 à ce qui suit:

shortcutManager = (ShortcutManager)getSystemService(SHORTCUT_SERVICE); 

Si vous souhaitez soutenir les anciennes versions Android, ne font pas shortcutManager une variable globale et au lieu de le créer dans la fonction addShortcut() et en enveloppant l'utilisation de la fonction dans la version sdk vérifier sur la ligne 7
Donc, vous devriez vous retrouver avec:

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