`
king_tt
  • 浏览: 2314910 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android开发心得——网页通过webview调用Android的图片或文件选择

 
阅读更多

本博文欢迎转载,转载请注明来自http://www.cnblogs.com/qinxianyuzou/

前段时间因为客户需求,做一个客户端结合web微网站的应用。其中,这个应用设计到了要修改头像,但是这个页面却是在微网站上实现的,意味着网站要调用到Android的打开文件的方法,那么这个通过webview是怎么实现的呢?

经过跟服务器的同事讨论发现,方法都是跟pc上是一样的,都是调用一个叫input type=file的属性,于是我就开始找,webview是怎么响应这个属性的了。

于是翻网站找到资料,不难查到,想要适用php上调用打开文件的方法,webview就要重写一个名为openFileChooser的方法。

但是这个方法的使用却不简单,这个方法是要调用webview的setWebChromeClient方法,然后重写一个WebChromeClient类。来到这一步,相信有点开发经验的同行都不难解决。问题的关键就在于,当你重写WebChromeClient这个类的时候会发现,根本就没有openFileChooser这个方法,那要怎么重写呢?是不是意味着这个方法其实行不通?于是再次翻查资料,发现原来这个方法居然是隐藏方法,并不不存在显性的继承重写关系。

最后,我发现要使用这个方法,还得自己继承WebChromeClient这个类把openFileChooser(ValueCallback<Uri> uploadFile)这个方法给写出来,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
abstractclassTestWebChromeClient extendsWebChromeClient
{
privateWebChromeClient mWrappedClient;
protectedTestWebChromeClient(WebChromeClient wrappedClient)
{
mWrappedClient = wrappedClient;
}
/** {@inheritDoc} */
@Override
publicvoidonProgressChanged(WebView view, intnewProgress)
{
mWrappedClient.onProgressChanged(view, newProgress);
}
/** {@inheritDoc} */
@Override
publicvoidonReceivedTitle(WebView view, String title)
{
mWrappedClient.onReceivedTitle(view, title);
}
/** {@inheritDoc} */
@Override
publicvoidonReceivedIcon(WebView view, Bitmap icon)
{
mWrappedClient.onReceivedIcon(view, icon);
}
/** {@inheritDoc} */
@Override
publicvoidonReceivedTouchIconUrl(WebView view, String url, booleanprecomposed)
{
mWrappedClient.onReceivedTouchIconUrl(view, url, precomposed);
}
/** {@inheritDoc} */
@Override
publicvoidonShowCustomView(View view, CustomViewCallback callback)
{
mWrappedClient.onShowCustomView(view, callback);
}
/** {@inheritDoc} */
@Override
publicvoidonHideCustomView()
{
mWrappedClient.onHideCustomView();
}
/** {@inheritDoc} */
@Override
publicbooleanonCreateWindow(WebView view, booleandialog, booleanuserGesture,
Message resultMsg)
{
returnmWrappedClient.onCreateWindow(view, dialog, userGesture, resultMsg);
}
/** {@inheritDoc} */
@Override
publicvoidonRequestFocus(WebView view)
{
mWrappedClient.onRequestFocus(view);
}
/** {@inheritDoc} */
@Override
publicvoidonCloseWindow(WebView window)
{
mWrappedClient.onCloseWindow(window);
}
/** {@inheritDoc} */
@Override
publicbooleanonJsAlert(WebView view, String url, String message, JsResult result)
{
returnmWrappedClient.onJsAlert(view, url, message, result);
}
/** {@inheritDoc} */
@Override
publicbooleanonJsConfirm(WebView view, String url, String message, JsResult result)
{
returnmWrappedClient.onJsConfirm(view, url, message, result);
}
/** {@inheritDoc} */
@Override
publicbooleanonJsPrompt(WebView view, String url, String message,
String defaultValue, JsPromptResult result)
{
returnmWrappedClient.onJsPrompt(view, url, message, defaultValue, result);
}
/** {@inheritDoc} */
@Override
publicbooleanonJsBeforeUnload(WebView view, String url, String message,
JsResult result)
{
returnmWrappedClient.onJsBeforeUnload(view, url, message, result);
}
/** {@inheritDoc} */
@Override
publicvoidonExceededDatabaseQuota(String url, String databaseIdentifier,
longcurrentQuota, longestimatedSize, longtotalUsedQuota,
WebStorage.QuotaUpdater quotaUpdater)
{
mWrappedClient.onExceededDatabaseQuota(url, databaseIdentifier, currentQuota,
estimatedSize, totalUsedQuota, quotaUpdater);
}
/** {@inheritDoc} */
@Override
publicvoidonReachedMaxAppCacheSize(longspaceNeeded, longtotalUsedQuota,
WebStorage.QuotaUpdater quotaUpdater)
{
mWrappedClient
.onReachedMaxAppCacheSize(spaceNeeded, totalUsedQuota, quotaUpdater);
}
/** {@inheritDoc} */
@Override
publicvoidonGeolocationPermissionsShowPrompt(String origin,
GeolocationPermissions.Callback callback)
{
mWrappedClient.onGeolocationPermissionsShowPrompt(origin, callback);
}
/** {@inheritDoc} */
@Override
publicvoidonGeolocationPermissionsHidePrompt()
{
mWrappedClient.onGeolocationPermissionsHidePrompt();
}
/** {@inheritDoc} */
@Override
publicbooleanonJsTimeout()
{
returnmWrappedClient.onJsTimeout();
}
/** {@inheritDoc} */
@Override
@Deprecated
publicvoidonConsoleMessage(String message, intlineNumber, String sourceID)
{
mWrappedClient.onConsoleMessage(message, lineNumber, sourceID);
}
/** {@inheritDoc} */
@Override
publicbooleanonConsoleMessage(ConsoleMessage consoleMessage)
{
returnmWrappedClient.onConsoleMessage(consoleMessage);
}
/** {@inheritDoc} */
@Override
publicBitmap getDefaultVideoPoster()
{
returnmWrappedClient.getDefaultVideoPoster();
}
/** {@inheritDoc} */
@Override
publicView getVideoLoadingProgressView()
{
returnmWrappedClient.getVideoLoadingProgressView();
}
/** {@inheritDoc} */
@Override
publicvoidgetVisitedHistory(ValueCallback<String[]> callback)
{
mWrappedClient.getVisitedHistory(callback);
}
/** {@inheritDoc} */
publicvoidopenFileChooser(ValueCallback<Uri> uploadFile)
{
((TestWebChromeClient) mWrappedClient).openFileChooser(uploadFile);
}
}
 

以上代码我是在eoe上发现的,并不是我自己参详发现的哈。但是原作是谁我就不知道了,因为这段代码你只要百度一下openFileChooser这个方法你就能找到。

当你这样写好,然后就是去设置WebChromeClient的时候了。设置方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mContentView.web_main_web.setWebChromeClient(newTestWebChromeClient(
newWebChromeClient())
{
publicvoidopenFileChooser(ValueCallback<Uri> uploadFile)
{
if(mUploadMessage != null)
return;
mUploadMessage = uploadFile;
//自己写你的调用图片方法,我这里是封装了调用图片的方法的
//关键点在于这个mUploadMessage参数,获取到图片以后传给这个参数回去就可以了。
//具体用法百度一下就有。
       Select_Activity.start(mContext,mUploadMessage,indexUrlString,FILE_SELECTED);
}
});

当你设置完后,这个时候你就该兴高采烈地去测试了。

于是,你有可能会兴高采烈地发现,不行!!完全没有反应!

是不是开始怀疑这个方法是坑人的?是不是在努力骂撸主?来来来,别生气,让我告诉你真相。

我告诉你哦,这个方法其实一点都不吭人,真的可以啊,不过~这是在3.0以前的sdk上有效...但是现在的主流Android机基本都是4.0以上了,哪里还有3.0以前的系统?

于是你又开始了新的一轮骂娘,为什么我会知道?因为我那个时候也是这个反应!

那时候我努力地翻资料,把百度、eoe、CSDN、德问、博客园、安卓巴士、DEVDIV都翻烂了,终于找到了原因,原来泥煤的3.0的要多加一个参数才能生效!

于是我傻乎乎的仿照人家重写的openFileChooser方法,给TestWebChromeClient这个类添加了一个openFileChooser(ValueCallback<Uri> uploadFile, String acceptType)方法。(具体这个acceptType参数有什么用,我还不怎么清楚,有知道的大神麻烦告知一下哈)在webview的setWebChromeClient方法里也添加了一个对应调用方法。

于是新一轮测试又开始了。

终于,你又一次兴高采烈地骂娘了,泥煤的还是不行啊!(po主:喂!别打头,把我打傻了以后就不能分享技术了!)

于是,我终于相信了国内搜索引擎和论坛的不靠谱,我投靠了谷歌和stackoverflow。

说实话,po主的英文很烂,烂得掉渣了,只有小学5年级的水准(po主那个时候是四年纪开始学的英语)所以不到逼不得已都不想投靠外国网站,实在是看不到,这搜索不来啊!

我找了足足一天得谷歌,最后通过谷歌找到了stackoverflow上有这个相同的问题(我这英文的水平只能通过谷歌使用了,捂脸)

人家大神解答到,原来尼玛的4.0以后的版本又多了一个参数于是乎,再加一个openFileChooser(ValueCallback<Uri> uploadFile, String acceptType,String capture)方法就可以了。

下面我贴上TestWebChromeClient的完整代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
abstractclassTestWebChromeClient extendsWebChromeClient
{
privateWebChromeClient mWrappedClient;
protectedTestWebChromeClient(WebChromeClient wrappedClient)
{
mWrappedClient = wrappedClient;
}
/** {@inheritDoc} */
@Override
publicvoidonProgressChanged(WebView view, intnewProgress)
{
mWrappedClient.onProgressChanged(view, newProgress);
}
/** {@inheritDoc} */
@Override
publicvoidonReceivedTitle(WebView view, String title)
{
mWrappedClient.onReceivedTitle(view, title);
}
/** {@inheritDoc} */
@Override
publicvoidonReceivedIcon(WebView view, Bitmap icon)
{
mWrappedClient.onReceivedIcon(view, icon);
}
/** {@inheritDoc} */
@Override
publicvoidonReceivedTouchIconUrl(WebView view, String url, booleanprecomposed)
{
mWrappedClient.onReceivedTouchIconUrl(view, url, precomposed);
}
/** {@inheritDoc} */
@Override
publicvoidonShowCustomView(View view, CustomViewCallback callback)
{
mWrappedClient.onShowCustomView(view, callback);
}
/** {@inheritDoc} */
@Override
publicvoidonHideCustomView()
{
mWrappedClient.onHideCustomView();
}
/** {@inheritDoc} */
@Override
publicbooleanonCreateWindow(WebView view, booleandialog, booleanuserGesture,
Message resultMsg)
{
returnmWrappedClient.onCreateWindow(view, dialog, userGesture, resultMsg);
}
/** {@inheritDoc} */
@Override
publicvoidonRequestFocus(WebView view)
{
mWrappedClient.onRequestFocus(view);
}
/** {@inheritDoc} */
@Override
publicvoidonCloseWindow(WebView window)
{
mWrappedClient.onCloseWindow(window);
}
/** {@inheritDoc} */
@Override
publicbooleanonJsAlert(WebView view, String url, String message, JsResult result)
{
returnmWrappedClient.onJsAlert(view, url, message, result);
}
/** {@inheritDoc} */
@Override
publicbooleanonJsConfirm(WebView view, String url, String message, JsResult result)
{
returnmWrappedClient.onJsConfirm(view, url, message, result);
}
/** {@inheritDoc} */
@Override
publicbooleanonJsPrompt(WebView view, String url, String message,
String defaultValue, JsPromptResult result)
{
returnmWrappedClient.onJsPrompt(view, url, message, defaultValue, result);
}
/** {@inheritDoc} */
@Override
publicbooleanonJsBeforeUnload(WebView view, String url, String message,
JsResult result)
{
returnmWrappedClient.onJsBeforeUnload(view, url, message, result);
}
/** {@inheritDoc} */
@Override
publicvoidonExceededDatabaseQuota(String url, String databaseIdentifier,
longcurrentQuota, longestimatedSize, longtotalUsedQuota,
WebStorage.QuotaUpdater quotaUpdater)
{
mWrappedClient.onExceededDatabaseQuota(url, databaseIdentifier, currentQuota,
estimatedSize, totalUsedQuota, quotaUpdater);
}
/** {@inheritDoc} */
@Override
publicvoidonReachedMaxAppCacheSize(longspaceNeeded, longtotalUsedQuota,
WebStorage.QuotaUpdater quotaUpdater)
{
mWrappedClient
.onReachedMaxAppCacheSize(spaceNeeded, totalUsedQuota, quotaUpdater);
}
/** {@inheritDoc} */
@Override
publicvoidonGeolocationPermissionsShowPrompt(String origin,
GeolocationPermissions.Callback callback)
{
mWrappedClient.onGeolocationPermissionsShowPrompt(origin, callback);
}
/** {@inheritDoc} */
@Override
publicvoidonGeolocationPermissionsHidePrompt()
{
mWrappedClient.onGeolocationPermissionsHidePrompt();
}
/** {@inheritDoc} */
@Override
publicbooleanonJsTimeout()
{
returnmWrappedClient.onJsTimeout();
}
/** {@inheritDoc} */
@Override
@Deprecated
publicvoidonConsoleMessage(String message, intlineNumber, String sourceID)
{
mWrappedClient.onConsoleMessage(message, lineNumber, sourceID);
}
/** {@inheritDoc} */
@Override
publicbooleanonConsoleMessage(ConsoleMessage consoleMessage)
{
returnmWrappedClient.onConsoleMessage(consoleMessage);
}
/** {@inheritDoc} */
@Override
publicBitmap getDefaultVideoPoster()
{
returnmWrappedClient.getDefaultVideoPoster();
}
/** {@inheritDoc} */
@Override
publicView getVideoLoadingProgressView()
{
returnmWrappedClient.getVideoLoadingProgressView();
}
/** {@inheritDoc} */
@Override
publicvoidgetVisitedHistory(ValueCallback<String[]> callback)
{
mWrappedClient.getVisitedHistory(callback);
}
/** {@inheritDoc} */
publicvoidopenFileChooser(ValueCallback<Uri> uploadFile)
{
((TestWebChromeClient) mWrappedClient).openFileChooser(uploadFile);
}
/** {@inheritDoc} */
publicvoidopenFileChooser(ValueCallback<Uri> uploadFile, String acceptType)
{
((TestWebChromeClient) mWrappedClient).openFileChooser(uploadFile, acceptType);
}
/** {@inheritDoc} */
publicvoidopenFileChooser(ValueCallback<Uri> uploadFile, String acceptType,
String capture)
{
((TestWebChromeClient) mWrappedClient).openFileChooser(uploadFile, acceptType,
capture);
}
}

一下是setWebChromeClient需要添加的方法。

1
2
3
4
5
6
7
8
9
10
publicvoidopenFileChooser(ValueCallback<Uri> uploadFile, String acceptType)
{
openFileChooser(uploadFile);
}
publicvoidopenFileChooser(ValueCallback<Uri> uploadFile, String acceptType,
String capture)
{
openFileChooser(uploadFile);
}

尽管前面很多部分都不难找到,但是后面这段3.0和4.0坑爹隐藏代码实在让人惨死。我当初都差点放弃了,国内论坛我还没有发现到关于这个描述,所以我就在这里分享一下,也当作是马克,省得以后忘记了。

这回终于不用再被骂娘了,感谢CCAV,感谢TVC,感谢老爸,感谢老妈,感谢老外。

分享到:
评论

相关推荐

    西门子S7-200PLC与MCGS触摸屏联动控制步进伺服电机的技术解析及应用实例

    内容概要:本文详细介绍了利用西门子S7-200PLC与昆仑通泰MCGS触摸屏联合控制步进伺服电机的方法和技术要点。首先阐述了硬件接线的具体方式,包括PLC输出接口与伺服驱动器之间的正确连接以及必要的安全措施如急停开关的接入。接着深入探讨了PLC程序的核心代码片段,涵盖原点回归、手动正转触发、绝对位置计算等功能模块,并解释了关键指令如PLS的作用及其使用注意事项。此外,针对触摸屏的关键配置进行了说明,涉及数值输入框、指示灯、多状态按钮等组件的设置,强调了绝对定位逻辑的实现。文中还分享了一些常见的调试问题及解决方案,例如伺服电机抖动、数据刷新延迟等问题的处理办法。最后提到该方案已在实际生产环境中成功应用并表现出良好的性能指标。 适合人群:从事自动化控制领域的工程师和技术人员,特别是那些希望深入了解PLC与触摸屏协同工作的专业人士。 使用场景及目标:适用于需要高精度定位控制的小型自动化生产线或机械设备中,旨在帮助用户掌握如何构建稳定可靠的步进伺服控制系统,提高工作效率的同时降低成本。 其他说明:作者凭借丰富的实践经验提供了许多宝贵的建议和技巧,对于初学者而言是非常有价值的参考资料。

    光储并网直流微电网Simulink仿真模型:MPPT与混合储能系统的优化设计

    内容概要:本文详细介绍了光储并网直流微电网的Simulink仿真模型构建,涵盖多个关键技术点。首先讨论了光伏系统的最大功率点跟踪(MPPT)算法,特别是扰动观察法的具体实现及其优缺点。接着探讨了由蓄电池和超级电容组成的混合储能系统,强调了它们各自的特点以及如何通过控制算法进行有效的功率分配。此外,还讲解了二阶低通滤波法的应用,用于提高电能质量和优化不同频率范围内的功率管理。最后,文章深入解析了逆变器的双闭环控制系统,包括电压环和电流环的设计,以确保逆变器输出与大电网的良好匹配。 适合人群:从事新能源系统设计、电力电子技术研究的专业人士,尤其是对Simulink仿真工具有所了解的研发人员。 使用场景及目标:适用于希望深入了解光储并网直流微电网内部机制和技术细节的研究者和工程师。主要目标是帮助读者掌握如何利用Simulink工具箱搭建完整的光储并网直流微电网仿真平台,从而为实际工程应用提供理论支持和技术指导。 其他说明:文中提供了大量具体的Matlab/Simulink代码片段,便于读者理解和实践。同时,作者分享了许多宝贵的实战经验和调试技巧,有助于解决实际建模过程中可能遇到的问题。

    西门子1200 PLC轴运动控制程序模板:多轴伺服、电缸控制及PLC通信实战应用

    内容概要:本文详细介绍了一套成熟的西门子1200 PLC轴运动控制程序模板,涵盖多轴伺服控制、电缸控制、PLC通信、气缸报警、电路图、威纶通触摸屏程序和IO表等方面的内容。该模板已在多个项目中成功应用,特别是在海康威视的路由器外壳装配机项目中表现优异。文中不仅提供了具体的代码示例,还分享了许多实战经验和技巧,如轴控制块的参数设置、PUT/GET通讯的心跳检测、气缸报警的互锁逻辑、电路图中的电源保护措施等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些需要进行PLC编程和轴运动控制的从业者。 使用场景及目标:①快速掌握西门子1200 PLC轴运动控制的编程方法;②提高PLC程序的稳定性和可靠性;③优化设备性能,确保高效生产和故障预防。 其他说明:该模板不仅适用于新项目的开发,也可以作为现有系统的改进参考。通过学习和应用这些技术和经验,可以显著提升工作效率和产品质量。

    智能驾驶领域基于神经网络的驾驶员风格自适应ACC系统安全距离模型研究

    内容概要:本文探讨了基于神经网络训练的不同驾驶员风格自适应ACC(自适应巡航控制)系统,尤其是其安全距离模型的研究。传统ACC系统采用固定的参数设置,难以适应不同驾驶员的驾驶习惯。文中介绍了通过神经网络训练,使ACC系统能够学习并适应不同驾驶员的驾驶风格,从而动态调整安全距离的方法。具体实现了基于LSTM和物理模型融合的混合式神经网络结构,以及定制化的损失函数,确保系统在不同驾驶风格下的安全性和舒适度。实验结果显示,该系统能够在不同驾驶风格间灵活切换,提升应对复杂路况的能力。 适合人群:对智能驾驶技术和机器学习感兴趣的科研人员、工程师和技术爱好者。 使用场景及目标:适用于智能汽车的研发和改进,旨在提高ACC系统的智能化水平,使其更加符合不同驾驶员的习惯,提升驾驶体验和安全性。 其他说明:文章还讨论了模型的实际应用挑战,如不同地区的驾驶文化差异,并提出了相应的解决方案。

    计算机三级网络机试考试试题及答案(下).pdf

    计算机三级网络机试考试试题及答案(下).pdf

    UWB DW1000高精度3D定位系统:基于CH32F103C8T6与卡尔曼滤波的实现及应用

    内容概要:本文详细介绍了基于Decawave UWB DW1000定位模块和CH32F103C8T6控制器构建的高精度3D定位系统。系统分为定位模块和测距模块,前者负责接收并计算用户位置,后者提供测距数据。定位模块采用最小二乘法和扩展卡尔曼滤波相结合的方式,实现了静态和动态环境下的高精度定位。文中还提供了详细的硬件配置、SPI接口初始化、测距算法以及定位算法的代码示例,并通过实验验证了系统的性能。 适合人群:对超宽带(UWB)定位技术和嵌入式开发感兴趣的工程师和技术爱好者。 使用场景及目标:适用于需要高精度室内外定位的应用场景,如AGV调度、人员定位等。目标是帮助开发者理解和实现基于UWB的高精度定位系统。 其他说明:文中提到的关键技术点包括SPI接口配置、双边双向测距算法(DS-TWR)、天线延迟校准、最小二乘法和扩展卡尔曼滤波。此外,作者还分享了一些实用的经验和技巧,如SPI分频系数选择、光速值的精确度、状态方程的设计等。

    计算机实训总结.pdf

    计算机实训总结.pdf

    单片机课程设计-温度监控系统的设计

    单片机课程设计__温度监控系统的设计

    基于深度强化学习的微能源网能量管理与优化策略研究——使用DQN实现智能调度算法

    内容概要:本文详细探讨了利用深度强化学习(特别是DQN算法)进行微能源网的能量管理和优化调度。文中介绍了微能源网面临的挑战,如风光出力的不确定性以及传统优化算法的局限性。作者通过具体案例展示了如何构建微电网环境类MicrogridEnv,定义状态空间、动作空间和奖励函数,并实现了DQN神经网络架构。此外,还讨论了经验回放、双网络结构等关键技术细节,以及如何通过特征工程提高模型性能。最终,通过实际测试验证了DQN算法的有效性和优势。 适合人群:从事微能源网、智能电网研究的技术人员,对深度强化学习感兴趣的开发者,以及希望了解如何将机器学习应用于能源领域的研究人员。 使用场景及目标:适用于需要优化微能源网能量管理的场景,旨在提高能源利用率、降低成本并确保供电稳定性。主要目标是通过智能算法应对风光出力的不确定性和用户需求的波动,从而实现高效的能源调度。 其他说明:文章不仅提供了理论分析和技术实现,还包括了许多实用的经验分享和调试技巧,有助于读者更好地理解和应用深度强化学习于实际项目中。

    《基于yolov8的动物识别检测检测项目》(包含源码、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是均来自个人的课程设计、毕业设计或者具体项目,代码都测试ok,包含核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,答辩评审绝对信服的,拿来就能用。放心下载使用!源码、数据集、部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.dataset.txt文件,仅供学习参考, 切勿用于商业用途。

    A stateless, content-directed data prefetching mechanism

    Cache prefetch

    基于Matlab的FFT分析与滤波程序:信号频谱分析及基波提取

    内容概要:本文详细介绍了一种基于Matlab的FFT分析和滤波程序,旨在实现信号的频谱分析并提取特定频率的基波信号。文中通过具体代码实例展示了如何导入数据、绘制原始信号波形图、执行FFT分析、设计滤波器并对信号进行滤波处理。最终通过图形化展示,验证了滤波器的有效性和程序的实用性。 适合人群:从事信号处理、通信工程、电子工程等领域的工作技术人员,以及相关专业的学生和研究人员。 使用场景及目标:适用于需要对复杂信号进行频域分析和滤波处理的实际工程项目,如电力系统谐波分析、音频信号处理等。目标是帮助用户快速掌握Matlab在信号处理方面的应用技巧,提高工作效率。 其他说明:文中提供的代码可以直接运行于Matlab环境,用户可根据实际情况调整参数以适应不同应用场景。同时,文中附有多张图表,便于理解和验证各个步骤的效果。

    基于MATLAB与FPGA的直方图均衡化图像处理技术实现及应用

    内容概要:本文详细介绍了利用MATLAB进行直方图均衡化算法的仿真以及在FPGA上实现该算法的具体步骤和技术要点。首先,通过MATLAB代码展示了直方图统计、累积分布函数(CDF)计算和像素映射的过程,并解释了相关注意事项如索引偏移等问题。接着,深入探讨了FPGA实现中的三个主要模块:直方图统计、CDF计算和像素映射,强调了硬件并行特性的利用,特别是双端口RAM的应用及其带来的挑战。此外,还讨论了Modelsim联合仿真的方法,包括将MATLAB生成的数据用于仿真验证,确保硬件实现的准确性。最后,分享了多个实际案例的效果对比,展示了直方图均衡化在改善图像质量方面的显著成效。 适合人群:对图像处理感兴趣的研究人员、工程师,尤其是希望深入了解FPGA实现图像处理算法的技术人员。 使用场景及目标:适用于需要提高图像对比度和清晰度的应用场合,如医学影像、安防监控等领域。目标是掌握直方图均衡化算法的工作原理及其在FPGA平台上的高效实现方法。 其他说明:文中提供了详细的代码示例和调试技巧,帮助读者更好地理解和实践。同时提到了一些常见的错误和解决方案,有助于避免初学者常犯的问题。

    V型永磁同步电机永磁体参数调整与优化技术解析及Maxwell仿真应用

    内容概要:本文详细探讨了V型永磁同步电机中永磁体参数调整的方法和技术,特别是在Maxwell软件中的应用。首先介绍了V型永磁体的关键参数(如V型夹角、磁钢厚度、极弧系数等)及其对电机性能的影响。接着讨论了利用Maxwell进行参数化建模、参数扫描、优化方法(如响应面法、多目标遗传算法)的具体步骤和注意事项。文中还提供了多个实用脚本,涵盖从几何建模、材料属性设置到求解器配置、后处理分析等多个方面。此外,强调了优化过程中应注意的问题,如退磁校验、磁密饱和、涡流损耗等,并给出了一些实战技巧。 适合人群:从事电机设计与仿真的工程师、研究人员,尤其是熟悉Maxwell软件的用户。 使用场景及目标:帮助用户掌握V型永磁同步电机永磁体参数调整的技术要点,提高电机性能指标(如降低齿槽转矩、减少谐波失真、优化转矩波动等)。通过实例和脚本指导,使用户能够在Maxwell中高效地完成仿真和优化任务。 其他说明:文章不仅提供了详细的理论解释,还包括大量实践经验分享和常见问题解决方案,有助于读者更好地理解和应用相关技术。

    使用相位阵列系统工具箱中的函数处理雷达数据立方体 matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于Matlab的滚动轴承与齿轮复合故障仿真信号生成及验证

    内容概要:本文详细介绍了如何使用Matlab生成滚动轴承和齿轮同时发生故障的复合仿真信号。首先,分别生成了滚动轴承内圈故障和齿轮断齿故障的信号,通过设置不同的参数如故障特征频率、调制深度等,利用卷积运算将冲击序列和衰减振荡波形结合,生成带有调制特征的故障信号。接着,将这两种故障信号进行适当的能量配比并加入适量噪声,最终形成复合故障信号。为了验证仿真信号的有效性,进行了频谱分析,确保在特定频率范围内能够观察到预期的故障特征。 适合人群:机械工程领域的研究人员和技术人员,尤其是从事故障诊断和信号处理工作的专业人士。 使用场景及目标:适用于研究和开发故障诊断算法,特别是在复杂机械设备中,用于测试和验证故障分离算法的效果。通过这种方式,可以在没有实际设备的情况下,提前评估算法性能,减少试验成本和风险。 其他说明:文中提供了详细的代码示例和调试技巧,帮助读者更好地理解和实现复合故障仿真。此外,还强调了仿真信号与实际情况之间的差异以及需要注意的问题,如参数设置、信噪比调整等。

    直流电机模糊PID控制技术详解及其Python与C语言实现

    内容概要:本文详细介绍了将模糊控制与传统PID相结合应用于直流电机控制的方法。首先阐述了传统PID控制在面对负载突变或转速大幅变化时的局限性,随后引入模糊PID的概念并展示了具体的实现步骤。文中提供了完整的Python和C语言代码示例,涵盖模糊规则表的设计、隶属度函数的选择以及参数自适应调整机制。此外,作者还分享了多个实用的经验技巧,如参数调整范围限制、误差量化因子选择、抗积分饱和算法的应用等。并通过实验数据对比证明了模糊PID相比传统PID在响应速度和稳定性方面的优势。 适合人群:具有一定自动化控制理论基础和技术实践经验的研发人员,尤其是从事电机控制系统开发的技术人员。 使用场景及目标:适用于需要提高直流电机控制系统鲁棒性和响应速度的实际工程项目。主要目标是在保持系统稳定的前提下,缩短调节时间和减少超调量,从而提升整体性能。 其他说明:尽管模糊PID能够显著改善某些特定条件下的控制效果,但仍需注意合理设置初始参数和调整幅度限制。同时,对于不同类型的电机和应用场景,可能还需要进一步优化模糊规则和隶属度函数。

    微电网经济调度中的两阶段鲁棒优化模型及其应用

    内容概要:本文深入探讨了微电网经济调度中面临的可再生能源与负荷不确定性问题,提出并详细解析了两阶段鲁棒优化模型。该模型采用独特的min-max-min结构,旨在最恶劣的不确定性场景下实现最低运行成本。文中不仅介绍了模型的具体构建方式,包括储能系统的运行约束和协调控制、不确定性调节参数的应用,还展示了基于列约束生成算法与强对偶理论的求解策略。此外,通过Matlab + YALMIP + CPLEX搭建的仿真平台验证了模型的有效性,并揭示了分时电价机制对储能调度的影响。 适合人群:从事微电网研究、电力系统优化、智能电网设计的研究人员和技术人员。 使用场景及目标:适用于需要处理可再生能源和负荷不确定性问题的微电网调度场景,帮助投资者规划储能规模,指导配电网运营商设计合理的激励机制,从而提高微电网的经济性和稳定性。 其他说明:文中提供了详细的代码示例,涵盖Python和Matlab伪代码,便于读者理解和实践。同时,强调了模型在极端天气条件下的局限性,并提出了改进方向。

    基于Matlab/Simulink的双馈风机参与四机两区域系统一次调频建模与控制策略研究

    内容概要:本文介绍了利用Matlab/Simulink构建的四机两区域电力系统模型,重点探讨了双馈风机(DFIG)在一次调频中的应用。模型包含了虚拟惯性控制、下垂控制和超速减载三大核心模块。通过调整不同控制参数,如惯性时间常数H、下垂系数K_droop以及转速-功率曲线斜率等,验证了双馈风机在频率调节中的快速响应特性和储能潜力。仿真结果显示,适当配置的双馈风机可以有效改善系统的频率稳定性和抗干扰能力,但也指出过高风电渗透率可能削弱调频效果。 适合人群:从事电力系统自动化、风电接入技术和MATLAB/Simulink仿真的研究人员和技术人员。 使用场景及目标:适用于研究风电并网对电力系统稳定性的影响,特别是探索双馈风机在一次调频中的角色和优化方法。目标是提高含风电的电力系统的频率响应性能。 其他说明:文中提供的代码片段和参数设置均为简化版本,实际应用时需考虑更多因素,如保护机制和物理约束条件。此外,模型揭示了风电渗透率与调频效果之间的非线性关系,提示了未来研究方向。

    碳交易机制下综合能源系统的优化运行模型及需求响应策略

    内容概要:本文探讨了在碳交易机制下,如何通过需求响应策略优化综合能源系统的运行,以实现节能减排和经济高效的目标。文章首先介绍了需求响应的概念,将其分为价格型和替代型两种形式,并通过Python代码展示了如何构建价格弹性矩阵和能量转换模型。接着讨论了碳交易机制的应用,包括基准线法分配碳排放配额以及碳排放成本的计算方法。最后,文章提出了一个基于Pyomo的优化模型,将购能成本、碳成本和运维成本进行综合优化,并通过四个典型场景验证了模型的有效性。 适合人群:从事能源管理、碳交易、电力系统优化等相关领域的研究人员和技术人员。 使用场景及目标:适用于希望在碳中和背景下,通过优化能源系统运行降低成本并减少碳排放的企业和机构。具体应用场景包括但不限于电力公司、工业企业和政府相关部门。 其他说明:文中提供的代码片段和模型仅为示例,在实际应用中需要根据具体情况调整参数和模型结构。此外,数据质量和准确性对于模型效果至关重要,因此在实施过程中应注意收集高质量的数据。

Global site tag (gtag.js) - Google Analytics