2017-08-03 46 views
2

我已經遵循了Shai的本地接口教程,但我堅持暗示代碼中的android本機代碼。一旦設備關閉,我需要獲取電池電量(百分比)。我已經在原生android中完成了它,並且我在cn1中構建了也需要該功能的應用程序。下面我提供了代碼。請幫助我在cn1中應用它。三江源codenameone中用於獲取電池信息的本地接口

原生Android代碼:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //for mobile shutdown starts 
    IntentFilter filter = new IntentFilter(Intent.ACTION_SHUTDOWN); 
    BroadcastReceiver mReceiver = new ShutDownReceiver(); 
    registerReceiver(mReceiver, filter); 
    //for mobile shutdown ends 
} 

//for mobile shutdown 
public class ShutDownReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if (intent.getAction().equals(Intent.ACTION_SHUTDOWN)) 
     { 
      Log.e("shutdown","mobile shutdown"); 
      Log.e("shutdown battery percentage",getBatteryPCT() + ""); 
     } 
    } 
} 

public float getBatteryPCT() 
{ 
    IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
    Intent batteryStatus = this.registerReceiver(null, ifilter); 
    int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); 
    //Check if charging. 
    boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; 
    //Check if charger plugged in. 
    int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 
    //check if charging via USB. 
    boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; 
    //check if charging via AC. 
    boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; 
    int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
    int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 
    float batteryPct = level/(float)scale; 
    //Get the current battery percentage. 
    return batteryPct*100; 
} 

下面是我已經試過在CN1但構建失敗

public class MyNativeImpl { 

    public boolean isSupported() { 
     return true; 
    } 

    public void getShutDownBattery() { 
     IntentFilter filter = new IntentFilter(Intent.ACTION_SHUTDOWN); 
     BroadcastReceiver mReceiver = new ShutDownReceiver(); 
     registerReceiver(mReceiver, filter); 

     getBatteryPCT(); 
     Log.e("battery status", getBatteryPCT() + ""); 
    } 

    public class ShutDownReceiver extends BroadcastReceiver { 

     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(Intent.ACTION_SHUTDOWN)) { 
       Log.e("shutdown", "mobile shutdown"); 

       Log.e("shutdown battery percentage", getBatteryPCT() + ""); 
      } 
     } 
    } 

    public float getBatteryPCT() { 
     IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
     Intent batteryStatus = this.registerReceiver(null, ifilter); 
     int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); 
     boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; 
     int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 
     boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; 
     boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; 
     int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
     int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 
     float batteryPct = level/(float) scale; 
     return batteryPct * 100; 
    } 
} 

爲MyNative接口

public interface MyNative extends NativeInterface{ 
    public void getShutDownBattery(); 
} 

更新1:

夏嘉曦你好,我有一對夫婦的關於你的回答下面的問題:

1)將ShutdownReceiver類頂級類,而不是一個內部類

爲什麼這裏沒有內部類的工作?

2)需要從AndroidNativeUtil的活動registerReceiver

我沒發現什麼生根粉AndroidNativeUtil FRM的你給的鏈接。以下行是否正確?

import com.codename1.impl.android.AndroidNativeUtil.registerReceiver(mReceiver,filter);

3)權限

我需要什麼權限?它不需要原生android代碼的任何權限。

更新代碼:

public class MyNativeImpl{ 

    public boolean isSupported() { 
     return true; 
    } 

    public void getShutDownBattery() { 
     IntentFilter filter = new IntentFilter(Intent.ACTION_SHUTDOWN); 
     BroadcastReceiver mReceiver = new ShutDownReceiver(); 
     AndroidNativeUtil.registerReceiver(mReceiver, filter); 
    } 
} 

class ShutDownReceiver extends BroadcastReceiver { 

    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(Intent.ACTION_SHUTDOWN)) { 
      Log.e("shutdown", "mobile shutdown"); 

      Log.e("shutdown battery percentage", getBatteryPCT() + ""); 
     } 
    } 

    public float getBatteryPCT() { 
     IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
     Intent batteryStatus = this.registerReceiver(null, ifilter); 
     int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); 
     //Check if charging. 
     boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; 
     //Check if charger plugged in. 
     int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 
     //check if charging via USB. 
     boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; 
     //check if charging via AC. 
     boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; 
     int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
     int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 
     float batteryPct = level/(float) scale; 
     //Get the current battery percentage. 
     return batteryPct * 100; 
    } 
} 

回答

0

移動ShutdownReceiver類頂層類,而不是一個內部類。 registerReceiver是一種活動方法,因此您需要從AndroidNativeUtil獲得活動,如。

本地代碼中缺少兩件事情,您需要執行這些操作,這些都是權限。您需要爲清單添加權限,並且可以通過構建提示android.xpermissions提示來完成。

您還需要請求代碼中的Android 6+權限,並且您可以通過AndroidNativeUtil調用checkForPermission來完成此操作,如here所述。

+0

哈囉你好,我有幾個問題shai。請看看上面的更新問題。 – beck

+0

我建議提交一個新的問題,因爲這很難遵循。 1. Android可能會嘗試動態加載一個類,所以它總是一個更好的習慣。 2. https://www.codenameone.com/manual/advanced-topics.html'AndroidNativeUtil.getActivity()。registerReceiver(mReceiver,filter);'3. https://stackoverflow.com/questions/14133077/android-操作關機廣播不工作提及'DEVICE_POWER' –

+0

我得到構建錯誤。我在原生android中試過它,它工作。我複製了問題 https:// stackoverflow。COM /問題/ 45520411 /原生接口功能於codenameone換得到電池 - 信息重複 – beck