zoukankan      html  css  js  c++  java
  • 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)) 

     最终真机的效果图

  • 相关阅读:
    基于Kubernates微服务案例
    领导人怎样带领好团队
    前端性能核对表Checklist-2018
    国际巨头互联网公司一些运营与管理思路
    IT研发工程师职业规划
    高性能风控数据平台设计
    基础设施DevOps演进之路
    2017-2018年Scrum状态调查报告
    大型互联网系统的监控流水线
    小程序【情书与歌】一小时过审经验小谈
  • 原文地址:https://www.cnblogs.com/jasondun/p/8261068.html
Copyright © 2011-2022 走看看