2、如何解决xamarin没有相关教程的的指导贴

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

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

授人以渔

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

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

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

http://blog.csdn.net/zhangyongfeiyong/article/details/53641809

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)) 

 最终真机的效果图

posted @ 2018-01-10 22:12  dotNET界面-大白  阅读(430)  评论(0编辑  收藏  举报