本篇文章主要在于解决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))
最终真机的效果图