【问题标题】:Native interface in codenameone for getting battery information代号为获取电池信息的本机接口
【发布时间】:2017-08-05 12:37:38
【问题描述】:

我已经按照 Shai 的本机接口教程进行操作,但我一直坚持在代号中暗示 android 本机代码。我需要在设备关闭后立即获取电池电量(百分比)。我已经在原生 android 中完成了它,并且我在 cn1 中构建了应用程序,它也需要该功能。下面我提供了代码。请帮我在cn1中应用它。谢谢你

原生安卓代码:

@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:

你好 Shai,我有几个关于你在下面的回答的问题:

1)将 ShutdownReceiver 类移动到顶级类而不是内部类

为什么内部类在这里不起作用?

2)需要从AndroidNativeUtil中获取activity用于registerReceiver

我在您提供的链接中没有找到任何关于 AndroidNativeUtil 的内容。以下行是否正确?

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;
    }
}

【问题讨论】:

    标签: codenameone


    【解决方案1】:

    ShutdownReceiver 类移动到顶级类而不是内部类。 registerReceiver 是一种活动方法,因此您需要像我 explained in the video 一样从 AndroidNativeUtil 获取活动。

    本机代码中缺少两件您需要做的事情,那就是权限。您需要为清单添加权限,您可以通过构建提示 android.xpermissions 提示来实现。

    您还需要在代码中请求 Android 6+ 权限,您可以通过 AndroidNativeUtil 调用 checkForPermission 来完成此操作,如 here 所述。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多