VFY:无法解析静态方法10876:Android

我在我的程序中使用了SmsCbMessage.java类。 它取自http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/telephony/SmsCbMessage.java#SmsCbMessage以下是我的程序。

package com.android.internal.telephony; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.SmsCbMessage; import android.widget.Toast; public class MainActivity extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //---get the CB message passed in--- Bundle bundle = intent.getExtras(); SmsCbMessage[] msgs = null; String str = ""; if (bundle != null) { //---retrieve the SMS message received--- Object[] pdus = (Object[]) bundle.get("pdus"); msgs = new SmsCbMessage[pdus.length]; for (int i=0; i<msgs.length; i++) { msgs[i] = SmsCbMessage.createFromPdu((byte[])pdus[i]); str += "CB lang " + msgs[i].getLanguageCode(); str += " :"; str += msgs[i].getMessageBody().toString(); str += "\n"; } //---display the new CB message--- abortBroadcast(); Toast.makeText(context, str, Toast.LENGTH_SHORT).show(); } } } 

这编译没有错误。 但在运行时会出现以下错误

 06-21 23:32:43.530 1951-1951/com.example.samitha.cbmessagespro I/dalvikvm﹕ Could not find method android.telephony.SmsCbMessage.createFromPdu, referenced from method com.android.internal.telephony.MainActivity.onReceive 06-21 23:32:43.530 1951-1951/com.example.samitha.cbmessagespro W/dalvikvm﹕ VFY: unable to resolve static method 10876: Landroid/telephony/SmsCbMessage;.createFromPdu ([B)Landroid/telephony/SmsCbMessage; 06-21 23:32:43.530 1951-1951/com.example.samitha.cbmessagespro W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41784c68) 06-21 23:32:45.580 1951-1951/com.example.samitha.cbmessagespro I/Process﹕ Sending signal. PID: 1951 SIG: 9 

怎么解决这个?

并非我在使用该SmsCbMessage.java类时也包含了所有必需的依赖类。

如果你看一下SmsCbMessage@android.googlesource.com的源代码

您将看到该类标有“@hide”属性

  /* * .... * @hide */ public class SmsCbMessage implements Parcelable {... 

这意味着该类是android的实现细节,它不是公共android api的一部分,可以在不事先通知的情况下进行更改或删除。

SmsCbMessage@android.googlesource.com热门的方法是public static SmsCbMessage createFromPdu(byte[] pdu)而你的codefragment确实拥有它。

您的测试设备确实有这个类但没有静态方法。

如果您想要使用该类,您可以将源代码添加到项目中并重命名该包

[更新2015-06-25]

因为从grepcodes添加源到本地项目不能解决问题,因为它有很多依赖项(特别是android.internal。*)

您可以创建自己的MySmsCbMessage,它inheritance自设备SmsCbMessage类,并尝试从grepcodes源添加缺少的函数。

 public class MySmsCbMessage extends SmsCbMessage { public static SmsCbMessage createFromPdu(byte[] pdu) { try { return new MySmsCbMessage(pdu); } catch (IllegalArgumentException e) { Log.w(LOG_TAG, "Failed parsing SMS-CB pdu", e); return null; } } } 

这仍然是一个脆弱的解决方法,因为您不能避免其他设备将具有SmsCbMessage

华为很可能已经定制了SmsCbMessage类。 你可以做的是使用reflection来查看该类可用的方法,并希望它看起来像你需要的方法。 尝试这样的事情:

 try { Class clazz = Class.forName("android.telephony.SmsCbMessage"); Method[] methods = clazz.getDeclaredMethods(); for (Method m : methods) { Log.v("XXX", "Method found: " + m); } } catch (Exception e) { Log.e("XXX", "Exception: " + e); }