2014-07-20 17 views

Odpowiedz

8

następujący kod użycie Reflection API Javy, jest mniej preferrable powodu braku skuteczności, ale Android nie przewiduje inny sposób tak, można użyć to działa z wdziękiem:

try { 
     Method m = wpm.getClass().getMethod(
       "setDeviceName", 
       new Class[] { WifiP2pManager.Channel.class, String.class, 
         WifiP2pManager.ActionListener.class }); 

     m.invoke(WifiP2pManager wifimngr,WifiP2pManager.Channel wifichannel, new_name, new WifiP2pManager.ActionListener() { 
      public void onSuccess() { 
       //Code for Success in changing name 
      } 

      public void onFailure(int reason) { 
       //Code to be done while name change Fails 
      } 
     }); 
    } catch (Exception e) { 

     e.printStackTrace(); 
    } 
+0

Czy mógłbyś wyjaśnić i wyjaśnić, dlaczego ten kod byłby przekreślony i co robi? Dzięki – yochannah

6

Ten kod działa dla mnie .

WifiP2pManager manager; 
WifiP2pManager.Channel channel; 
    try { 
     manager = (WifiP2pManager)getSystemService(Context.WIFI_P2P_SERVICE); 
     channel = manager.initialize(this, getMainLooper(), new WifiP2pManager.ChannelListener() { 
      @Override 
      public void onChannelDisconnected() { 
       manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); 
      } 
     }); 
     Class[] paramTypes = new Class[3]; 
     paramTypes[0] = WifiP2pManager.Channel.class; 
     paramTypes[1] = String.class; 
     paramTypes[2] = WifiP2pManager.ActionListener.class; 
     Method setDeviceName = manager.getClass().getMethod(
       "setDeviceName", paramTypes); 
     setDeviceName.setAccessible(true); 

     Object arglist[] = new Object[3]; 
     arglist[0] = channel; 
     arglist[1] = devName; 
     arglist[2] = new WifiP2pManager.ActionListener() { 

      @Override 
      public void onSuccess() { 
       Log.d("setDeviceName succeeded", "true"); 
      } 

      @Override 
      public void onFailure(int reason) { 
       Log.d("setDeviceName failed", "true"); 
      } 
     }; 
     setDeviceName.invoke(manager, arglist); 

    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } 
+0

Przetestowałem to na Androida 6.0.1 dzisiaj - działa świetnie. Dziękuję Ci. –

+0

to działa, czy istnieje ryzyko dla bezpieczeństwa? co z transmisją intencji z WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION? – user3290180