本篇文章主要在于解决xamarin相关文档偏少的问题。

最终的代码并不重要。重要的还是那种处理的方式

授人以渔

群里有群友讨论说需要读取安卓的 充电电流。这样的问题实际上在原生java有一堆。但是到了xamarin就一头懵逼不知道如何下手。

今天我主要讲解如何把别人有的东西转换为xamarin使用的。

1、首先百度 安卓 读取充电电流。 第一篇就是最成熟的 关于原生读取充电电流的文章。二话不说直接复制到xamarin中编辑修改。

2、替换掉相关的java语法 采用C#的语法。 java中的大部分类 都被封装为了java.Lang里面 仔细观看即可

下面显示 我翻译后的类

[Activity(Label = "AppGetElectricity", MainLauncher = true)]

    public class MainActivity : Activity

    {

 

 

        private string getCurrent()

        {

            string result = "null";

            try

            {

                Java.Lang.Class systemProperties = Java.Lang.Class.ForName("android.os.SystemProperties");

 

                Java.Lang.Reflect.Method get = systemProperties.GetDeclaredMethod("get", Java.Lang.Class.FromType(typeof(Java.Lang.String)));

                //Method get = systemProperties.getDeclaredMethod("get", String.class);  

                string platName = new string(((Java.Lang.String)get.Invoke(null, "ro.hardware")).ToCharArray());

                if (platName.StartsWith("mt") || platName.StartsWith("MT"))

                {

                    string filePath = "/sys/class/power_supply/battery/device/FG_Battery_CurrentConsumption";

                    // MTK平台该值不区分充放电,都为负数,要想实现充放电电流增加广播监听充电状态即可  

                    result = "当前电流为:" + System.Math.Round(getMeanCurrentVal(filePath, 5, 0) / 10.0f) + "mA";

                    result += ", 电压为:" + readFile("/sys/class/power_supply/battery/batt_vol", 0) + "mV";

                }

                else if (platName.StartsWith("qcom"))

                {

                    string filePath = "/sys/class/power_supply/battery/current_now";

                    int current = Java.Lang.Math.Round(getMeanCurrentVal(filePath, 5, 0) / 10.0f);

                    int voltage = readFile("/sys/class/power_supply/battery/voltage_now", 0) / 1000;

                    // 高通平台该值小于0时电池处于放电状态,大于0时处于充电状态  

                    if (current < 0)

                    {

                        result = "充电电流为:" + (-current) + "mA, 电压为:" + voltage + "mV";

                    }

                    else

                    {

                        result = "放电电流为:" + current + "mA, 电压为:" + voltage + "mV";

                    }

                }

            }

            catch (Java.Lang.Exception e)

            {

                e.PrintStackTrace();

            }

            return result;

        }

 

        protected override void OnCreate(Bundle savedInstanceState)

        {

            base.OnCreate(savedInstanceState);

 

            // Set our view from the "main" layout resource

            SetContentView(Resource.Layout.Main);

            FindViewById<Button>(Resource.Id.button1).Click += MainActivity_Click; ;

        }

 

        private void MainActivity_Click(object sender, System.EventArgs e)

        {

            Toast.MakeText(this, getCurrent(), ToastLength.Long).Show();

        }

 

        /** 

    * 获取平均电流值 

    * 获取 filePath 文件 totalCount 次数的平均值,每次采样间隔 intervalMs 时间  

    */

        private float getMeanCurrentVal(string filePath, int totalCount, int intervalMs)

        {

            float meanVal = 0.0f;

            if (totalCount <= 0)

            {

                return 0.0f;

            }

            for (int i = 0; i < totalCount; i++)

            {

                try

                {

                    float f = readFile(filePath, 0);

                    meanVal += f / totalCount;

                }

                catch (Java.Lang.Exception e)

                {

                    e.PrintStackTrace();

                }

                if (intervalMs <= 0)

                {

                    continue;

                }

                try

                {

                    Java.Lang.Thread.Sleep(intervalMs);

                }

                catch (Java.Lang.Exception e)

                {

                    e.PrintStackTrace();

                }

            }

            return meanVal;

        }

 

        private int readFile(string path, int defaultValue)

        {

            try

            {

                string lines = System.IO.File.ReadAllText(path);

                return int.Parse(lines);

                //BufferedReader bufferedReader = new BufferedReader(new FileReader(

                //        path));

                //int i = Integer.parseInt(bufferedReader.readLine(), 10);

                //bufferedReader.close();

                //return i;

            }

            catch (System.Exception localException)

            {

            }

            return defaultValue;

        }

 

 

    }

这里面 还替换了 java原生冗长的一些写法。

这里面唯一麻烦点的就是关于java的反射比如我要反射String.Class  我这里替换为了 Java.Lang.Class.FromType(typeof(Java.Lang.String)) 

 最终真机的效果图

如何解决xamarin没有相关教程的的指导贴_.net

 

 

如何解决xamarin没有相关教程的的指导贴_.net_02