首页 文章 精选 留言 我的

精选列表

搜索[图数据库],共10000篇文章
优秀的个人博客,低调大师

react-native绑定优酷SDK-附效果图和源码

ReactNative绑定优酷SDK需要用到两部分知识: 优酷本身的sdk绑定; RN与原生界面的交互; 效果: RN版本:0.49.3 代码更新日期:2017.10.26 下文也根据绑定需要分为两部分: 一、优酷sdk绑定; 二、RN与原生页面的交互; 一、优酷SDK绑定 1.优酷云平台创建应用,获取到client_id和client_secret; 申请地址:http://cloud.youku.com/app 如图: 2.引入sdk: 在目录app/libs加入优酷sdk:mma_sdk.jar、utdid4all-1.1.5.5.jar、YoukuPlayerOpenSDK-release.aar,sdk下载地址:http://cloud.youku.com/down/play 在目录app/build.gradle里面添加下面两段配置: android { // ... 之前本身配置,下面为添加的配置 //添加libs目录配置 repositories { flatDir { dirs 'libs' } } sourceSets { main { jniLibs.srcDirs = ['libs']; } } } dependencies { // ... 之前本身配置,下面为添加的配置 //公共库 compile 'com.alibaba:fastjson:1.1.56.android' compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' //sdk compile(name: 'YoukuPlayerOpenSDK-release', ext: 'aar') } 3.在MainApplication.java初始化优酷播放代码: import com.youku.cloud.player.YoukuPlayerConfig; //请在这里输入你的应用的clientId,clientSecret public static final String CLIENT_ID_WITH_AD = "e7e4d0ee1591b0bf"; public static final String CLIENT_SECRET_WITH_AD = "1fbf633f8a55fa1bfabf95729d8e259a"; @Override public void onCreate() { super.onCreate(); SoLoader.init(this, /* native exopackage */ false); YoukuPlayerConfig.setClientIdAndSecret(CLIENT_ID_WITH_AD,CLIENT_SECRET_WITH_AD); YoukuPlayerConfig.onInitial(this); YoukuPlayerConfig.setLog(false); } 4.新建Activity和后置类; 页面代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.gangguwang.yewugo.YKPlayerActivity" android:orientation="vertical"> <com.youku.cloud.player.YoukuPlayerView android:id="@+id/baseview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" > </com.youku.cloud.player.YoukuPlayerView> </LinearLayout> 后置类代码: package com.gangguwang.yewugo; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.Toast; import android.text.TextUtils; import com.youku.cloud.player.YoukuPlayerConfig; import com.youku.cloud.player.YoukuPlayerView; import com.youku.cloud.utils.Logger; import com.youku.cloud.module.PlayerErrorInfo; import com.youku.cloud.player.PlayerListener; import com.youku.cloud.player.VideoDefinition; import com.youku.cloud.utils.ValidateUtil; import com.youku.download.DownInfo; public class NativeActivity extends AppCompatActivity { private YoukuPlayerView youkuPlayerView; private String vid="XMzA1NzYwMTQxNg=="; private String password=""; private boolean local = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_native); // Intent mIntent=getIntent(); // if(mIntent!=null) { // Toast.makeText(this,"请求参数:"+mIntent.getStringExtra("params"),Toast.LENGTH_SHORT).show();; // } // Button btn_two=(Button)this.findViewById(R.id.btn_two); // //btn_two.setVisibility(View.GONE); //隐藏按钮 // btn_two.setOnClickListener(new View.OnClickListener() { // @Override // public void onClick(View v) { // Intent mIntent=new Intent(NativeActivity.this,MainActivity.class); // mIntent.putExtra("data","你是123..."); // NativeActivity.this.startActivity(mIntent); // NativeActivity.this.finish(); // } // }); youkuPlayerView = (YoukuPlayerView)findViewById(R.id.baseview); // 初始化播放器 youkuPlayerView.attachActivity(this); youkuPlayerView.setPreferVideoDefinition(VideoDefinition.VIDEO_HD); youkuPlayerView.setPlayerListener(new MyPlayerListener()); youkuPlayerView.setShowFullBtn(true); autoplayvideo(); } private void autoplayvideo() { if (local) { youkuPlayerView.playLocalVideo(vid); } else { if (TextUtils.isEmpty(password)) { youkuPlayerView.playYoukuVideo(vid); } else { youkuPlayerView.playYoukuPrivateVideo(vid, password); } } } @Override protected void onPause() { super.onPause(); // 必须重写的onPause() youkuPlayerView.onPause(); } @Override protected void onResume() { super.onResume(); // 必须重写的onResume() youkuPlayerView.onResume(); } @Override protected void onDestroy() { super.onDestroy(); // 必须重写的onDestroy() youkuPlayerView.onDestroy(); } // 添加播放器的监听器 private class MyPlayerListener extends PlayerListener { @Override public void onComplete() { // TODO Auto-generated method stub super.onComplete(); } @Override public void onError(int code, PlayerErrorInfo info) { // TODO Auto-generated method stub //txt1.setText(info.getDesc()); } @Override public void OnCurrentPositionChanged(int msec) { // TODO Auto-generated method stub super.OnCurrentPositionChanged(msec); } @Override public void onVideoNeedPassword(int code) { // TODO Auto-generated method stub super.onVideoNeedPassword(code); } @Override public void onVideoSizeChanged(int width, int height) { // TODO Auto-generated method stub super.onVideoSizeChanged(width, height); } } } 5.配置AndroidManifest.xml 5.1:给你的播放器Activity加上监听屏幕旋转的语句 <activity android:name=".NativeActivity" android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|uiMode" android:exported="true" android:launchMode="singleTask" /> 5.2:添加权限 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /> 到此,优酷播放的sdk已经配置完毕。 二、RN与原生页面的互交 使用NativeModules模块互交,本章分为: 1.RN调用; 2.创建中间交互类IntentModule.java、IntentReactPackage.java; 3.使用反射和Intent进行通知原生界面; 1.RN调用代码: <Button onPress={() => { NativeModules.IntentModule.startActivityFromJS('你的包名.NativeActivity', '参数'); }} title=" 播 放 " color="#841584" /> 2.创建中间交互类 a).注册原生模块类 IntentReactPackage.java 代码如下: package com.gangguwang.yewugo; import com.facebook.react.ReactPackage; import com.facebook.react.bridge.JavaScriptModule; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; import java.util.Arrays; import java.util.Collections; import java.util.List; public class IntentReactPackage implements ReactPackage { @Override public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { return Arrays.<NativeModule>asList( new IntentModule(reactContext) ); } // @Override // public List<Class<? extends JavaScriptModule>> createJSModules() { // return Collections.emptyList(); // } @Override public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { return Collections.emptyList(); } } 代码解读:固定的api固定的方法必须重写createNativeModules和createViewManagers方法,只是把另一个交互类IntentModule注册到createNativeModules里面。 b).创建你的RN交互暴露方法类 IntentModule.java,代码如下: package com.gangguwang.yewugo; import android.app.Activity; import android.content.Intent; import android.text.TextUtils; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.JSApplicationIllegalArgumentException; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; public class IntentModule extends ReactContextBaseJavaModule { public IntentModule(ReactApplicationContext reactContext) { super(reactContext); } @Override public String getName() { return "IntentModule"; } /** * Activtiy跳转到JS页面,传输数据 * @param successBack * @param errorBack */ @ReactMethod public void dataToJS(Callback successBack, Callback errorBack){ try{ Activity currentActivity = getCurrentActivity(); String result = currentActivity.getIntent().getStringExtra("data"); if (TextUtils.isEmpty(result)){ result = "没有数据"; } successBack.invoke(result); }catch (Exception e){ errorBack.invoke(e.getMessage()); } } /** * 从JS页面跳转到原生activity 同时也可以从JS传递相关数据到原生 * @param className * @param params */ @ReactMethod public void startActivityFromJS(String className, String params){ try{ Activity currentActivity = getCurrentActivity(); if(null!=currentActivity){ Class toActivity = Class.forName(className); Intent intent = new Intent(currentActivity,toActivity); //intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("params", params); currentActivity.startActivity(intent); } }catch(Exception e){ throw new JSApplicationIllegalArgumentException("不能打开Activity : "+e.getMessage()); } } /** * 从JS页面跳转到Activity界面,并且等待从Activity返回的数据给JS * @param className * @param params * @param requestCode * @param successBack * @param errorBack */ @ReactMethod public void startActivityFromJSGetResult(String className, String params, int requestCode, Callback successBack, Callback errorBack){ try { Activity currentActivity = getCurrentActivity(); if(currentActivity != null) { Class toActivity = Class.forName(className); Intent intent = new Intent(currentActivity,toActivity); //intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("params", params); currentActivity.startActivityForResult(intent,requestCode); // //进行回调数据 // successBack.invoke(MainActivity.mQueue.take()); } } catch (Exception e) { errorBack.invoke(e.getMessage()); e.printStackTrace(); } } // /** // * 必须添加反射注解不然会报错 // * 这个方法就是ReactNative将要调用的方法,会通过此类名字调用 // * @param msg // */ // @ReactMethod // public void callNativeMethod(String msg) { // Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show(); // //startActivityForResult(myIntent, 1); // } } c).在MainApplication.java里面设置交互类IntentReactPackage @Override protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), new IntentReactPackage() ); } 3.使用反射和Intent进行通知原生界面; 在IntentModule已经体现了,核心代码: Activity currentActivity = getCurrentActivity(); if(null!=currentActivity){ Class toActivity = Class.forName(className); Intent intent = new Intent(currentActivity,toActivity); intent.putExtra("params", params); currentActivity.startActivity(intent); } 到此为止已经全部大功告成!源码地址:https://github.com/vipstone/react-native-youku 如果本文对你有所帮助,请打赏——1元就足够感动我:) 联系邮箱:intdb@qq.com 我的GitHub: https://github.com/vipstone 关注公众号: 作者: 王磊 出处: http://vipstone.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,请标明出处。

优秀的个人博客,低调大师

一张图看清物联网细分领域投资热点分布

物联网已经从概念拓展到了日益广泛和深入的行业应用。与此同时,风险资本对本领域的投资有增无减。据统计,在过去五年中,物联网创业公司累计吸引了74亿美元资金。 CB Insights编制了一份物联网细分领域投资热度表(只统计自2011年以来投资数量至少10起的领域;绿色表示投资数量较高,红色表示投资数量较低)。这份表格能够清晰地显示出:哪些领域投资热度较高,甚至已经饱和;哪些领域投资热度较低,但具有较好的未来成长机会。 毫无疑问的是,在过去五年中,健康/健身领域对物联网技术的接纳程度较高,产生了最多的投资交易。本领域的投资由WiThings和Misfit Wearables这样的可穿戴技术公司所拉动。同时,我们也可以注意到:2015年可穿戴领域的投资数量由上年度的25起降低为19起,投资热度相对降低。 商业智能同样是物联网应用较多的领域,在过去五年的投资热度位列第二。本领域获投资的典型公司则有:WebAction、Umbel、TempoIQ等。 2015年,机器人领域投资数量大幅上扬,以大疆创新和3D Robotics为代表的无人机企业,以GreyOrange Robotics与Rethink Robotics为代表的仓库自动化管理企业获得了融资。2014年,上述领域投资数量7起,交易额6650万美元;2015年投资数量增长到19起,交易额增长到2.6亿美元。 在过去五年中,供应链与物流管理领域的物联网投资处于缓慢增长状态。该领域的创业公司主要致力于车队连接与云端管理,2015年度获融资的典型企业有Telogis、Peleton Technology、Greenroad Technologies。 工业与制造是物联网应用亟待开发的一个领域。虽然2015年该领域投资数量不足10起,但我们还是能够看到Sight Machine和Eigen Innovations这样的先行者已经开始在这一领域布局。 此外,数据显示:会议、无线&通讯、照明等领域的物联网技术投资仍处于较低水平。 本文转自d1net(转载)

优秀的个人博客,低调大师

开源中国 OSC 源创会第 23 期 深圳场 高清大图

2014年的线下活动总算在4月份的深圳开了个好头,活动场地还是在老地方。但凡来的都有小礼品送哦!每人8G的U盘一个!本次活动由 福田软件公共技术服务平台 协办。感谢又拍云存储、sendcloud、爱加密对本次活动的大力支持!感谢光环智业管理咨询公司提供的礼品赞助。好吧,已经有人今天一大早就跟我说no picture no true 了!下面上图! 文章转载自开源中国社区 [http://www.oschina.net]

优秀的个人博客,低调大师

一图胜千言,阿里云视觉大数据智能计算实践

以下内容根据演讲PPT以及现场分享整理而成。 引言 在大数据世界里面,视觉大数据应该是量级最大的。之前讲的天文的数据量非常大的,但其实天文的数据也是天眼的数据,说到底还是视觉的数据。 视觉智能计算并不是只做简单地进行一些图像视频的处理,而是要通过人工智能和机器学习的方法在数据中去识别、搜索和挖掘其中的价值,使得数据的价值得以体现,让用户对于数据的使用体验更好。 生活中的各种监控以及直播很普及,一个城市可能有多达60万个摄像头,所以产生的视频数据确实非常多。那么该如何处理这么多的数据呢?如何才能发现我们需要的东西呢? 大家在日常生活中比方旅游时往往会拍摄很多图片以及视频,但是之后这些数据怎么办呢?怎么看?怎么查?怎么用?往往会成为一件非常麻烦的事情,那么技术能不能把这件事情做得更好呢? 当然在其他领域也有很多的图像视觉的东西,对于这些方面,我

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册