NFCとAndroidのサポートが必要です。
AndroidでMifare4Kのエミュレーションを可能にするために多くの調査を行った後、存在する唯一のパッチが2.3.4用に作成されていることがわかりました。ここStackOverFlowで、NFCGuyは、AndroidのAPI 14以降、ROMにパッチを適用する必要がないため、非表示のNfc_extrasパッケージを使用してカードエミュレーションをオンにできると語っています。
リフレクション付きのNFC_EXTRASを使用してAPKをコンパイルし、署名とパッケージをnfcee_access.xmlに追加しました。
cardEmulationRouteをON_WHEN_SCREEN_ONに設定した後、logcatに、NFCEEがオンでNFC_CCがオンであることを示す出力が表示されますが、Nexus SをACR122に近づけると、2.3.4パッチメーカーが検出できるエミュレートされたMifare4Kが検出されません。得る。認識されないスマートカードを入手できますが(SEはスマートカードのように機能していると思います)、エミュレートされたMifareを使用する必要があります。
アプレットを機能させるには、2.3.4パッチで変更されたlib-nfcを変更する必要がありますか(Mifare Manager)?または、私のアプリにアクセスすると、そのパッケージで十分なはずですか?
2.3.4パッチを4.1に移植するためにAndroidソースをダウンロードしていますが、投稿された差分を見ると、lib-nfcライブラリの4.1との違いしかありません。(コメント付きの定義、理論的にはカードエミュレーションに使用されます)
おそらく、変更されたROMを再コンパイルする必要はなく、エミュレートされたMifare4kを取得するための小さなステップがありません。
StackOverFlowのすべての人にご協力いただきありがとうございます
よろしく
private void getSecureElement(){
try{
//Obtenemos la clase NFCAdapterExtras
Class nfcExtrasClazz = Class.forName("com.android.nfc_extras.NfcAdapterExtras");
if (nfcExtrasClazz == null){
Log.w("EnableCardEmu", "No existe la clase Extras");
return;
}
Log.w("EnableCardEmu", "Existe la clase");
//Obtenemos el método "get" de dicha clase
Method getMethod = nfcExtrasClazz.getMethod("get", Class.forName("android.nfc.NfcAdapter"));
if (getMethod == null) {
Log.w("EnableCardEmu", "No existe el método");
} else {
Log.w("EnableCardEmu", "Existe el método");
//Obtenemos el manager del componente NFC del dispositivo
NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);
if (adapter == null)
Log.w("EnableCardEmu", "Adapter es null");
else {
//Instancia del SecureElement
Log.w("EnableCardEmu", "Adapter NO es null");
nfcExtras = getMethod.invoke(null, adapter);
Method getEEMethod = nfcExtras.getClass().getMethod("getEmbeddedExecutionEnvironment",
(Class[]) null);
embebbed = getEEMethod.invoke(nfcExtras , (Object[]) null);
}
}
} catch (InvocationTargetException ee){
Log.w("EnableCardEmu", ee.getTargetException());
}
catch (Exception e){
Log.w("EnableCardEmu", e.getClass().getName() + " / " + e.getMessage());
StackTraceElement[] a = e.getStackTrace();
for (StackTraceElement aa : a){
Log.w("EnableCardEmu", aa.toString());
}
}
}
private void deactivateCardEmulation(){
try{
Class clss = Class.forName("com.android.nfc_extras.NfcAdapterExtras");
Class[] cs = clss.getDeclaredClasses();
/*
for (Class cc : cs){
Log.w("EnableCardEmu", cc.getName();)
}*/
//Class route = Class.forName("com.android.nfc_extras.NfcAdapterExtras$CardEmulationRoute");
Constructor c = cs[0].getConstructor(Integer.TYPE, Class.forName("com.android.nfc_extras.NfcExecutionEnvironment"));
Object routeOn = c.newInstance(1, null);
Class cls = nfcExtras.getClass();
Method mtd = cls.getMethod("setCardEmulationRoute", cs[0]);
mtd.invoke(nfcExtras, routeOn);
} catch (InvocationTargetException ee){
Log.w("EnableCardEmu", ee.getTargetException());
} catch (Exception e){
Log.w("EnableCardEmu", e.getClass().getName() + " / " + e.getMessage());
}
}
private void activateCardEmulation(){
try{
Class clss = Class.forName("com.android.nfc_extras.NfcAdapterExtras");
Class[] cs = clss.getDeclaredClasses();
/*
for (Class cc : cs){
Log.w("EnableCardEmu", cc.getName();)
}*/
//Class route = Class.forName("com.android.nfc_extras.NfcAdapterExtras$CardEmulationRoute");
Constructor c = cs[0].getConstructor(Integer.TYPE, Class.forName("com.android.nfc_extras.NfcExecutionEnvironment"));
Object routeOn = c.newInstance(2, embebbed);
Class cls = nfcExtras.getClass();
Method mtd = cls.getMethod("setCardEmulationRoute", cs[0]);
mtd.invoke(nfcExtras, routeOn);
} catch (InvocationTargetException ee){
Log.w("EnableCardEmu", ee.getTargetException());
} catch (Exception e){
Log.w("EnableCardEmu", e.getClass().getName() + " / " + e.getMessage());
}
}