genymotion安装(unknown generic error)及配置在Android studio环境中

本文详细介绍Genymotion模拟器的下载、安装过程及其在Android Studio中的配置方法,解决安装过程中可能遇到的链接失败等问题。

genymotion模拟器的优点我就不阐述了,一个字:快!!!现在来说一下刚开始使用genymotion时碰到的问题一:**下载及安装**(不用挂vpn速度一般般,如果想快点安装的话点这里http://download.youkuaiyun.com/detail/mr_oorange/8501473,慢点的下载速度genymotion在中国的官网下载地址下载链接:http://www.genymotion.net/)

在下载之前你必须先去官网注册一个账号以便后续激活,按着他给的提示来,跟我们大陆注册差不多,邮箱验证之类的啦,一看就会。注册完之后就是下载了,也很简单,如图:

一:技术分享

二:技术分享

三:![点击第一个,原因下面给出]

下载完毕后什么不用管,一直点击next就行(本人没有放在系统盘,看读者自己能力)。安装genymotion的同时也会安装一个Oracle VM virtual box。安装就是,先不管它,也是一直点击next就行。之后会用到

OK,打开genymotion我们需要创建一个虚拟设备,第一次使用的话会自动弹出创建提示框

四:技术分享

五:![如果这一步骤成功链接的话,请跳转至:]技术分享


在这里很多人可能会碰到一个问题,链接不了错误提示**genymotion unknown generic error**,现在大家打开刚下载的Oracle VM virtual box,需要设置一个虚拟网卡。如图:技术分享

[连接方式需要配置成图片上内容](技术分享

[连接方式需要配置成图片上内容](技术分享)


**OK**现在再重新连接---成功!!!

登陆成功以后,会显示可以模拟哪种开型号的手机。(技术分享

然后!技术分享 终于出来了!

技术分享


配置在Android studio环境中

**到这里终于算是安装完成了。那么问题又来了,如何配置在Android studio环境中呢,请看**

技术分享

打开Android studio在setting里面点击到plugins,点击browse repositores然后搜索genymotion,右边会有一个![点击install plugins](技术分享)点击install plugins,系统弹出提示框让你重启Android sutdio,点击reset。然后。。。。。。。。。。。就没有然后了。。。。运行一个Android项目便会有新的genymotion模拟器出来了,跟默认的模拟器可以说拜拜喽(虚拟设备参数跟默认的虚拟设备一样的,自己设置)。技术分享技术分享技术分享技术分享技术分享技术分享技术分享

技术分享

技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享

以下是对您提供的 C# 代码的**逐句注释分析**,基于 **SuperMap iObjects .NET 平台**开发的 Windows 窗体应用程序。该程序实现了地图加载、工作空间管理、图层控制、数据源操作等功能。 --- ```csharp using SuperMap.Data; using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using SuperMap.Mapping; using SuperMap.UI; ``` > 导入所需的命名空间: > - `SuperMap.Data`:用于处理数据源、数据集、工作空间等地理数据对象。 > - `System.*`:.NET 基础类库(窗体、集合、IO 等)。 > - `SuperMap.Mapping`:地图渲染和图层管理相关类。 > - `SuperMap.UI`:用户界面控件,如 MapControl 控件。 --- ```csharp namespace 实验2 { public partial class Form1 : Form { //定义mapcontrol控件 private Workspace workspace1 = new SuperMap.Data.Workspace(); private MapControl mapControl1 = new MapControl(); ``` > 定义一个名为“实验2”的命名空间。 > 创建主窗体 `Form1`,继承自 `Form`。 > 声明两个私有字段: > - `workspace1`:表示 SuperMap 工作空间对象,用于管理多个数据源和地图。 > - `mapControl1`:地图显示控件,负责可视化地图内容。 --- ```csharp public Form1() { mapControl1.Map.Workspace = workspace1; mapControl1.AllowDrop = true; mapControl1.DragEnter += new DragEventHandler(mapControl1_DragEnter); mapControl1.GeometrySelected += new SuperMap.UI.GeometrySelectedEventHandler(mapControl1_GeometrySelected); InitializeComponent(); workspaceControl1.WorkspaceTree.NodeMouseDoubleClick += new TreeNodeMouseClickEventHandler(workspaceControl1_WorkspaceTree_NodeMouseDoubleClick); workspaceControl1.WorkspaceTree.AllowDefaultAction = true; workspaceControl1.AllowDefaultAction = true; layersControl1.Map = mapControl1.Map; layersControl1.LayersTree.NodeMouseDoubleClick += new TreeNodeMouseClickEventHandler(LayersTree_NodeMouseDoubleClick); } ``` > 构造函数中初始化组件及事件绑定: > - 将 `mapControl1` 的地图关联到 `workspace1`,使其能访问工作空间中的地图与数据。 > - 允许拖拽操作(`AllowDrop = true`)。 > - 绑定拖拽进入事件(`DragEnter`),实现从工作空间树拖动数据到地图。 > - 绑定几何要素选中事件(`GeometrySelected`),后续可响应选择行为。 > - 调用 `InitializeComponent()` 加载设计器生成的 UI 组件(如 panel、button 等)。 > - 为 `workspaceControl1` 的树节点双击事件添加处理函数,支持双击打开数据或地图。 > - 启用默认双击动作(例如自动加载数据)。 > - 将 `layersControl1` 的图层列表绑定到 `mapControl1.Map`,实现实时同步图层状态。 > - 为图层树双击事件绑定处理函数(目前为空)。 --- ```csharp private void Form1_Load(object sender, EventArgs e) { workspaceControl1.Dock = DockStyle.Fill; panel1.Controls.Add(workspaceControl1); mapControl1.Dock = DockStyle.Fill; panel2.Controls.Add(mapControl1); layersControl1.Dock = DockStyle.Fill; panel3.Controls.Add(layersControl1); } ``` > 窗体加载时布局控件: > - 设置 `workspaceControl1` 填充整个 `panel1` 区域,用于展示工作空间结构(数据源、地图等)。 > - 将 `mapControl1` 添加进 `panel2` 并填满,作为主要的地图显示区域。 > - 将 `layersControl1` 添加进 `panel3` 并填满,用于管理当前地图的图层顺序和可见性。 --- ```csharp private void Form1_FormClosing(object sender, FormClosingEventArgs e) { mapControl1.Dispose(); layersControl1.Dispose(); workspace1.Close(); workspace1.Dispose(); } ``` > 窗体关闭前释放资源: > - 显式调用 `Dispose()` 回收地图控件资源。 > - 关闭并释放工作空间对象,防止内存泄漏或文件占用问题。 --- ```csharp private void workspaceControl1_WorkspaceTree_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { AddData(); } ``` > 当在工作空间树上双击任意节点时,触发 `AddData()` 方法,尝试根据节点类型加载对应的数据或地图。 --- ```csharp private void LayersTree_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { } ``` > 图层树双击事件未实现功能(占位符)。 --- ```csharp private void mapControl1_DragEnter(object sender, DragEventArgs e) { try { WorkspaceTreeDragData data = e.Data.GetData(typeof(WorkspaceTreeDragData)) as WorkspaceTreeDragData; Layers layers = mapControl1.Map.Layers; switch (data.DataType) { case WorkspaceTreeNodeDataType.DatasetVector: { List<Dataset> datasets = data.Data as List<Dataset>; if (datasets == null) break; foreach (Dataset dataset in datasets) { layers.Add(dataset, true); } } break; case WorkspaceTreeNodeDataType.DatasetImage: { List<Dataset> datasets = data.Data as List<Dataset>; if (datasets == null) break; foreach (Dataset dataset in datasets) { layers.Add(dataset, true); } } break; case WorkspaceTreeNodeDataType.DatasetGrid: { List<Dataset> datasets = data.Data as List<Dataset>; if (datasets == null) break; foreach (Dataset dataset in datasets) { layers.Add(dataset, true); } } break; case WorkspaceTreeNodeDataType.MapName: { mapControl1.Map.Close(); List<String> maps = data.Data as List<String>; if (maps == null) break; else { String mapName = maps[0].ToString(); mapControl1.Map.Open(mapName); mapControl1.Map.Refresh(); } } break; default: break; } mapControl1.Map.Refresh(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } ``` > 处理从工作空间树拖拽数据到地图控件的操作: > - 获取拖拽数据对象 `WorkspaceTreeDragData`。 > - 判断其类型(矢量、影像、栅格、地图名等)。 > - 若为数据集类型,则将其加入当前地图图层,并刷新地图。 > - 若为地图名称,则先关闭当前地图,再打开指定名称的地图。 > - 最后统一刷新地图视图。 > - 异常捕获并弹出错误消息。 --- ```csharp private void mapControl1_GeometrySelected(object sender, GeometrySelectedEventArgs e) { } ``` > 地图中几何对象被选中时触发此事件(当前为空,可用于高亮、属性查询等扩展功能)。 --- ```csharp private void toolOpenWorkspace_Click(object sender, EventArgs e) { openFileDialog1.Filter = "SuperMap 工作空间文件(*.sxw;*.smwu)|*.sxw;*.smwu"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { mapControl1.Map.Close(); String fileName = openFileDialog1.FileName; WorkspaceConnectionInfo connectionInfo = new WorkspaceConnectionInfo(fileName); workspace1.Open(connectionInfo); workspaceControl1.WorkspaceTree.Workspace = workspace1; mapControl1.Map.Workspace = workspace1; if (workspace1.Maps.Count == 0) { MessageBox.Show("当前工作空间中不存在地图!"); return; } else { mapControl1.Map.Open(workspace1.Maps[0]); layersControl1.Map = mapControl1.Map; mapControl1.Map.Refresh(); } } } ``` > “打开工作空间”按钮点击事件: > - 设置文件筛选器仅允许 `.sxw` 或 `.smwu` 格式的工作空间文件。 > - 用户选择后,先关闭当前地图。 > - 使用 `WorkspaceConnectionInfo` 打开所选文件。 > - 将 `workspace1` 绑定到 `workspaceControl1` 和 `mapControl1`。 > - 检查是否有地图存在;若无则提示;若有则打开第一个地图并刷新。 --- ```csharp private void AddData() { try { WorkspaceTreeNodeBase node = workspaceControl1.WorkspaceTree.SelectedNode as WorkspaceTreeNodeBase; WorkspaceTreeNodeDataType type = node.NodeType; if ((type & WorkspaceTreeNodeDataType.Dataset) != WorkspaceTreeNodeDataType.Unknown) { type = WorkspaceTreeNodeDataType.Dataset; } switch (type) { case WorkspaceTreeNodeDataType.Dataset: { Dataset dataset = node.GetData() as Dataset; if (layersControl1.Map != null) { layersControl1.Map.Layers.Clear(); layersControl1.Map.Layers.Add(dataset, true); layersControl1.Map.Refresh(); } } break; case WorkspaceTreeNodeDataType.MapName: { String mapName = node.GetData() as String; if (layersControl1.Map != null) { mapControl1.Map.Open(mapName); mapControl1.Map.Refresh(); Layers layers = mapControl1.Map.Layers; layersControl1.Map.Refresh(); } } break; case WorkspaceTreeNodeDataType.SymbolMarker: case WorkspaceTreeNodeDataType.SymbolLine: case WorkspaceTreeNodeDataType.SymbolFill: { SymbolLibraryDialog.ShowDialog(workspace1.Resources, GetSymbolType(type)); } break; default: break; } } catch { } } private SymbolType GetSymbolType(WorkspaceTreeNodeDataType nodeType) { return nodeType switch { WorkspaceTreeNodeDataType.SymbolMarker => SymbolType.Marker, WorkspaceTreeNodeDataType.SymbolLine => SymbolType.Line, WorkspaceTreeNodeDataType.SymbolFill => SymbolType.Fill, _ => SymbolType.Marker }; } ``` > `AddData()` 方法用于处理双击节点后的加载逻辑: > - 获取当前选中的节点及其类型。 > - 如果是某种数据集(点线面等),提取 `Dataset` 对象并添加到地图图层(清空原有图层)。 > - 如果是地图名,则打开对应地图。 > - 如果是符号节点(标记/线型/填充),则弹出符号库对话框供编辑。 > - 新增辅助方法 `GetSymbolType` 来转换节点类型为对应的 `SymbolType` 枚举值。 > - 异常被静默忽略(不推荐生产环境使用空 catch)。 --- ```csharp private void toolZoomIn_Click(object sender, EventArgs e) { mapControl1.Action = SuperMap.UI.Action.ZoomIn; } private void toolZoomOut_Click(object sender, EventArgs e) { mapControl1.Action = SuperMap.UI.Action.ZoomOut; } private void toolZoomFree_Click(object sender, EventArgs e) { mapControl1.Action = SuperMap.UI.Action.ZoomFree; } private void toolViewEntire_Click(object sender, EventArgs e) { mapControl1.Map.ViewEntire(); } private void toolPan_Click(object sender, EventArgs e) { mapControl1.Action = SuperMap.UI.Action.Pan; } private void toolSelect_Click(object sender, EventArgs e) { mapControl1.Action = SuperMap.UI.Action.Select2; } ``` > 工具栏按钮事件处理: > - 放大、缩小、自由缩放、平移、全图显示、选择要素等基本地图交互操作。 > - 通过设置 `mapControl1.Action` 属性切换不同的交互模式。 --- ```csharp private void toolCreateDataSource_Click(object sender, EventArgs e) { SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Filter = "SuperMap数据源文件(*.udb;*.udbx)|*.udb;*.udbx"; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { DatasourceConnectionInfo datasourceConnectInfo = new DatasourceConnectionInfo(); datasourceConnectInfo.Server = saveFileDialog1.FileName; Datasource datasource = workspace1.Datasources.Create(datasourceConnectInfo); } } ``` > 创建新的数据源: > - 弹出保存对话框让用户指定路径和文件名。 > - 构建连接信息 `DatasourceConnectionInfo`。 > - 在当前工作空间中创建一个新的 UDB/UDBX 类型的数据源文件。 --- ```csharp private void toolOpenDataSource_Click(object sender, EventArgs e) { openFileDialog1.Filter = "SuperMap数据源文件(*.udb;*.udbx)|*.udb;*.udbx"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { string fileName = openFileDialog1.FileName; DatasourceConnectionInfo datasourceConnectInfo = new DatasourceConnectionInfo(); datasourceConnectInfo.Server = fileName; if (fileName.EndsWith(".udb", StringComparison.OrdinalIgnoreCase)) { datasourceConnectInfo.EngineType = EngineType.UDB; } else if (fileName.EndsWith(".udbx", StringComparison.OrdinalIgnoreCase)) { datasourceConnectInfo.EngineType = EngineType.UDBX; } else { MessageBox.Show("不支持的数据源格式。"); return; } SuperMap.Data.Datasource datasource = workspace1.Datasources.Open(datasourceConnectInfo); if (datasource == null) { MessageBox.Show("打开数据源失败,请检查文件路径或是否被占用。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } string displayName = datasource.Alias ?? System.IO.Path.GetFileNameWithoutExtension(fileName); MessageBox.Show($"数据源别名:{displayName}", "调试信息", MessageBoxButtons.OK, MessageBoxIcon.Information); workspaceControl1.WorkspaceTree.Workspace = workspace1; mapControl1.Map.Workspace = workspace1; workspaceControl1.WorkspaceTree.Refresh(); MessageBox.Show($"数据源 '{displayName}' 已成功加载到工作空间!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } ``` > 打开已有数据源: > - 过滤器限制为 `.udb` / `.udbx` 文件。 > - 设置服务器路径和引擎类型(UDB 表示旧版,UDBX 是新版 SQLite 存储)。 > - 调用 `Open()` 方法打开数据源。 > - 若失败则提示原因。 > - 成功后更新控件绑定并刷新工作空间树。 > - 提示用户已成功加载。 --- ```csharp private void toolCloseDataSource_Click(object sender, EventArgs e) { try { WorkspaceTreeNodeBase selectedNode = workspaceControl1.WorkspaceTree.SelectedNode as WorkspaceTreeNodeBase; if (selectedNode == null) { MessageBox.Show("请先在工作空间树中选择一个数据源。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (selectedNode.NodeType != WorkspaceTreeNodeDataType.Datasource) { MessageBox.Show("请选择一个数据源节点进行关闭操作。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } Datasource datasource = selectedNode.GetData() as Datasource; if (datasource == null) { MessageBox.Show("无法获取数据源对象。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } DialogResult result = MessageBox.Show( $"确定要关闭数据源 '{datasource.Alias ?? datasource.Alias}' 吗?\n关闭后将无法访问其包含的数据集。", "确认关闭", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.No) return; bool isInUse = false; for (int i = 0; i < mapControl1.Map.Layers.Count; i++) { Layer layer = mapControl1.Map.Layers[i]; if (layer.Dataset?.Datasource == datasource) { isInUse = true; break; } } if (isInUse) { DialogResult useResult = MessageBox.Show( "当前地图中有图层正在使用此数据源的数据集。\n继续关闭可能导致图层丢失。\n是否清空地图图层并继续?", "警告", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning); if (useResult == DialogResult.Yes) { mapControl1.Map.Layers.Clear(); mapControl1.Map.Refresh(); } else if (useResult == DialogResult.Cancel || useResult == DialogResult.No) { return; } } datasource.Close(); workspaceControl1.WorkspaceTree.Refresh(); MessageBox.Show($"数据源 '{datasource.Alias}' 已成功关闭。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { MessageBox.Show($"关闭数据源时发生异常:{ex.Message}", "异常", MessageBoxButtons.OK, MessageBoxIcon.Error); } } ``` > 关闭数据源功能: > - 检查是否选中了节点且为数据源类型。 > - 获取 `Datasource` 对象。 > - 提示用户确认关闭操作。 > - 检查当前地图图层是否引用了该数据源中的数据集。 > - 若正在使用,则提示是否清空图层以继续关闭。 > - 调用 `datasource.Close()` 关闭连接(会自动从集合中移除)。 > - 刷新工作空间树。 > - 显示成功提示。 > - 异常捕获并提示。 --- ### ✅ 总结说明 这段代码是一个典型的基于 **SuperMap iObjects .NET** 开发的桌面 GIS 应用程序,具备以下核心功能: | 功能 | 描述 | |------|------| | 工作空间管理 | 打开 `.sxw/.smwu` 文件 | | 数据源管理 | 创建、打开、关闭 `.udb/.udbx` 数据源 | | 地图显示 | 使用 `MapControl` 显示地图 | | 图层控制 | 使用 `LayersControl` 管理图层 | | 工作空间树 | 使用 `WorkspaceControl` 浏览数据结构 | | 交互操作 | 缩放、平移、选择、全图等 | | 拖拽支持 | 可直接拖动数据集或地图到地图窗口 | --- ### ⚠️ 可优化建议 1. **避免空 `catch` 块**:应记录日志或提示具体错误。 2. **资源释放更完善**:应在 `Dispose()` 中统一管理非托管资源。 3. **UI 与逻辑分离**:可引入 MVP/MVVM 模式提高可维护性。 4. **国际化与本地化**:字符串硬编码不利于多语言支持。 5. **异常处理细化**:不同异常类型应分别处理。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值