2017-08-03 75 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