添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

图1 TextureView及其依赖的java/c++类

本文将从TetureView的用途、使用模式及其在Framework依赖的类(图1所示那些)的三个方面进行说明。

1. 用途

TextureView可用于承载显示『数据流』的场合,之前看到『流』不太明确其意义,这里给两个具体的场景大家体会一下:camera模块从sensor采集了1080p@30fps的预览数据『流』,视频通话模块从网络包里解出实时视频数据『流』。

2. 使用模式

说了它的用途,我们看下TextureView工作的模式。刚了解到新浪博客是不支持贴代码的,这是要逼着人说人话。好在此处代码不长,看图说话!

图2 基于TextureView的Camera应用

使用TextureView的步骤:

(1)MainActvity要实现TextureView.SurfaceTextureListener接口

(2)创建TextureView,并将​MainActvity设置为SurfaceTextureListener,供系统回调MainActvity实现的onSurfaceTextureXXX接口方法

(3)在​onSurfaceTextureAvailable回调中拿到SurfaceTexture,并把它设置给camera,作为承载、预览数据『流』的载体

(4)在​onSurfaceTextureDestroyed中关闭预览,释放camera资源,返回true

每个步骤的界面都很清晰。如果大家用过GLSurfaceView,用户代码里要显式的控制SurfaceTexture的声明、生成、下传,而TextureView则把​SurfaceTexture干净的从用户视野中拿掉了,这就是被叫做『Texture』View的原因吧!

到这儿,TextureView的用途和使用模式都讲清楚了。看过了咱们的牛,接下来要认真的屠牛啦,Go!

3. Framework代码解析​

​3.1 TextureView与『上一级』关系

​从图1可以看到TextureView与『上一级』(即用户代码中的MainActivity)只存在SurfaceTextureListener这一个关联点,表现为TextureView会在『适当』的时候调用『上一级』实现的SurfaceTextureListener接口方法。

​3.2 TextureView内部结构​

图1里TextureView与SurfaceTexture构成了组合关系,可见SurfaceTexture的确是由TextureView给『包办』了。在程序世界中,一个对象被『包办』无非是指:

(1)这个对象什么时候被创建?

(2)这个对象如何被创建?

(3)这个对象的产生带来了哪些变化,或者说程序自从有了它有哪些不同?

(4)这个对象什么时候被销毁?

之所以对​SurfaceTexture这个对象要大动笔墨,因为它是整个显示框架的『连接者』。

3.3 ​SurfaceTexture与『上一级』关系

Java层的SurfaceTexture,有setOnFrameAvailableListener方法,其将『上一级』对象(即TextureView)设置为onFrameAvailableListener,这样SurfaceTexture在拿到新的『流』数据时会通知TextureView。

3.4 SurfaceTexture底层结构

​​SurfaceTexture.java会直接调用SurfaceTexture.cpp中的native方法,注意后者是一层JNI,而非c++类。在创建Java层SurfaceTexture对象时,向下调用SurfaceTexture_init方法,其调用BufferQueue::createBufferQueue静态方法,后者会做以下几件事:

(1)创建​BufferQueueCore

(2)​将BufferQueueCore作为参数创建BufferQueueProducer

(3)将BufferQueueCore作为参数创建BufferQueueConsumer

BufferQueueCore最重要的对象就是mAllocator,其为IGraphicBufferAlloc​类型,其作用只有一个:分配GraphicBuffer内存。其类型是I开头的,我们似乎嗅到了什么。难道一个内存分配器都要通过IPC拿到?对,就是这样!

获取内存分配器的过程为:源进程(比如Camera APK)获取SurfaceComposer服务,通过该服务获取IGraphicBufferAlloc对象,后续内存分配要通过BufferQueueCore对象,都要通过BufferQueueCore的mAllocator对象,最终都要透过SurfaceComposer进程向Gralloc模块分配GraphicBuffer。

我们已经知道BufferQueueCore可以提供强大的GraphicBuffer分配支持。接下来聊聊​BufferQueueProducer,从图1看出其为BnGraphicBufferProducer的子类,也是『I』字辈的,对也是用来IPC的家伙!这里分析下 图2里onSurfaceTextureAvalilable中调用mCamera.setPreviewTexture(surface)这一瞬间发生的惊人内幕​

(1)快进,直接调到了native层BpCamera->setPreviewTarget( BufferQueueProducer ),注意 BufferQueueProducer是本地对象,『Bn』辈的小生。

(2)跨进程发生:​BufferQueueProducer对象到了内核,内核发现这货是个Binder,拦下,强行登记,只放走了一个『号码牌』(即handle)给目标进程(CameraService进程)。目标进程拿着号码牌,生成了一个BpBinder对象,此时这个BpBinder对象已经拥有了向内核找到源进程、以及源进程中BufferQueueProducer对象的能力。这个BpBinder没闲着,前脚被生成,后脚就被『踹进』了BpGraphicBufferProducer,就是『Bp』辈的后生。

(3)我要内存:CameraServcie可是内存消耗大户,1080p@30fps的YUV数据流,闹着玩呢!要分配内存,怎么干?很简单​CameraServcie进程中直接用BpGraphicBufferProducer->dequeueBurffer或者requestBuffer即可。

(4)实际内存分配:​BpGraphicBufferProducer因为有BpBinder,自然可以唤醒源进程(Camera APK进程)中的BnGraphicBufferProducer,调用对应的requestBuffer。实作的BnGraphicBufferProducer后生BufferQueueProducer拥有BufferQueueCore,自然可以向SurfaceCompser进程申请到GraphicBuffer,一路返还即可。

剩下的就是CameraServcie​进程填充好了GraphicBuffer,然后BpGraphicBufferProducer->enqueue将其置入队列,Camera APK进程中的BufferQueueProducer自然直到这个事件,可以在SurfaceTexuture.cpp这层JNI向上通知frameAvailable。

3.5 聊聊Surface​

最后,聊聊Surface这个native层类。Surface继承ANativeWindow,它的核心的就是传入它的​IGraphicBufferProducer对象,后续所有对Surface的操作都会传递到IGraphicBufferProducer。在CameraService进程,在拿到BpGraphicBufferProducer后,会在该进程生成一个Surface,传入的正是前者。而Surface则作为ANativeWindow类型,畅通无阻的传入了HAL模块。貌似它的作用就是给Android平台提供统一的一个window接口层。

3.6 TextureView如何使用?

如果你想显示一段在线视频或者任意的数据流比如视频或者OpenGL 场景,你可以用android中的TextureView做到。

TextureView的兄弟SurfaceView

应用程序的视频或者opengl内容往往是显示在一个特别的UI控件中:SurfaceView。SurfaceView的工作方式是创建一个置于应用窗口之后的新窗口。这种方式的效率非常高,因为SurfaceView窗口刷新的时候不需要重绘应用程序的窗口(android普通窗口的视图绘制机制是一层一层的,任何一个子元素或者是局部的刷新都会导致整个视图结构全部重绘一次,因此效率非常低下,不过满足普通应用界面的需求还是绰绰有余),但是SurfaceView也有一些非常不便的限制。

因为SurfaceView的内容不在应用窗口上,所以不能使用变换(平移、缩放、旋转等)。也难以放在ListView或者ScrollView中,不能使用UI控件的一些特性比如 View.setAlpha()

为了解决这个问题 Android 4.0中引入了TextureView。

TextureView

与SurfaceView相比,TextureView并没有创建一个单独的Surface用来绘制,这使得它可以像一般的View一样执行一些变换操作,设置透明度等。另外,Textureview必须在硬件加速开启的窗口中。

TextureView的使用非常简单,你唯一要做的就是获取用于渲染内容的SurfaceTexture。具体做法是先创建TextureView对象,然后实现SurfaceTextureListener接口,代码如下:

  1. private TextureView myTexture;
  2. public class MainActivity extends Activity implements SurfaceTextureListener{
  3. protected void onCreate(Bundle savedInstanceState) {
  4. myTexture = new TextureView(this);
  5. myTexture.setSurfaceTextureListener(this);
  6. setContentView(myTexture);
  7. }
  8. }

Activity implementsSurfaceTextureListener接口因此activity中需要重写如下方法:

  1. @Override
  2. public void onSurfaceTextureAvailable(SurfaceTexture arg0, int arg1, int arg2) {
  3. }
  4. @Override
  5. public boolean onSurfaceTextureDestroyed(SurfaceTexture arg0) {
  6. }
  7. @Override
  8. public void onSurfaceTextureSizeChanged(SurfaceTexture arg0, int arg1,int arg2) {
  9. }
  10. @Override
  11. public void onSurfaceTextureUpdated(SurfaceTexture arg0) {
  12. }


TextureView可以使用setAlphasetRotation方法达到改变透明度和旋转的效果。

  1. myTexture.setAlpha(1.0f);
  2. myTexture.setRotation(90.0f);

除了上面的方法之外,TextureView 还有如下方法:

序号方法&描述
1getSurfaceTexture()
This method returns the SurfaceTexture used by this view.
2getBitmap(int width, int height)
This method returns Returns a Bitmap representation of the content of the associated surface texture.
3getTransform(Matrix transform)
This method returns the transform associated with this texture view.
4isOpaque()
This method indicates whether this View is opaque.
5lockCanvas()
This method start editing the pixels in the surface
6setOpaque(boolean opaque)
This method indicates whether the content of this TextureView is opaque.
7setTransform(Matrix transform)
This method sets the transform to associate with this texture view.
8unlockCanvasAndPost(Canvas canvas)
This method finish editing pixels in the surface.

例子

下面的例子演示了如何使用TextureView类,我们创建了一个可以在TextureView中预览Camera的demo,可以改变它的角度以及方向。当然程序需要运行在有摄像头的设备上。

下面是MainActivity.java中的代码:

  1. package com.example.textureview;
  2. import java.io.IOException;
  3. import android.annotation.SuppressLint;
  4. import android.app.Activity;
  5. import android.graphics.SurfaceTexture;
  6. import android.hardware.Camera;
  7. import android.os.Bundle;
  8. import android.view.Gravity;
  9. import android.view.Menu;
  10. import android.view.TextureView;
  11. import android.view.TextureView.SurfaceTextureListener;
  12. import android.view.View;
  13. import android.widget.FrameLayout;
  14. public class MainActivity extends Activity implements SurfaceTextureListener {
  15. private TextureView myTexture;
  16. private Camera mCamera;
  17. @SuppressLint("NewApi")
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22. myTexture = new TextureView(this);
  23. myTexture.setSurfaceTextureListener(this);
  24. setContentView(myTexture);
  25. }
  26. @Override
  27. public boolean onCreateOptionsMenu(Menu menu) {
  28. // Inflate the menu; this adds items to the action bar if it is present.
  29. getMenuInflater().inflate(R.menu.main, menu);
  30. return true;
  31. }
  32. @SuppressLint("NewApi")
  33. @Override
  34. public void onSurfaceTextureAvailable(SurfaceTexture arg0, int arg1,
  35. int arg2) {
  36. mCamera = Camera.open();
  37. Camera.Size previewSize = mCamera.getParameters().getPreviewSize();
  38. myTexture.setLayoutParams(new FrameLayout.LayoutParams(
  39. previewSize.width, previewSize.height, Gravity.CENTER));
  40. try {
  41. mCamera.setPreviewTexture(arg0);
  42. } catch (IOException t) {
  43. }
  44. mCamera.startPreview();
  45. myTexture.setAlpha(1.0f);
  46. myTexture.setRotation(90.0f);
  47. }
  48. @Override
  49. public boolean onSurfaceTextureDestroyed(SurfaceTexture arg0) {
  50. mCamera.stopPreview();
  51. mCamera.release();
  52. return true;
  53. }
  54. @Override
  55. public void onSurfaceTextureSizeChanged(SurfaceTexture arg0, int arg1,
  56. int arg2) {
  57. // TODO Auto-generated method stub
  58. }
  59. @Override
  60. public void onSurfaceTextureUpdated(SurfaceTexture arg0) {
  61. // TODO Auto-generated method stub
  62. }
  63. }

activity_main.xml

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. tools:context=".MainActivity" >
  10. <TextureView
  11. android:id="@+id/textureView1"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:layout_alignParentTop="true"
  15. android:layout_centerHorizontal="true" />
  16. </RelativeLayout>

AndroidManifest.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.textureview"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-sdk
  7. android:minSdkVersion="8"
  8. android:targetSdkVersion="17" />
  9. <uses-permission android:name="android.permission.CAMERA"/>
  10. <application
  11. android:allowBackup="true"
  12. android:icon="@drawable/ic_launcher"
  13. android:label="@string/app_name"
  14. android:theme="@style/AppTheme" >
  15. <activity
  16. android:name="com.example.textureview.MainActivity"
  17. android:label="@string/app_name" >
  18. <intent-filter>
  19. <action android:name="android.intent.action.MAIN" />
  20. <category android:name="android.intent.category.LAUNCHER" />
  21. </intent-filter>
  22. </activity>
  23. </application>
  24. </manifest>


不同参数下的截图:

myTexture.setAlpha(0.5f);

myTexture.setRotation(45.0f);

Anroid TextureView Tutorial

myTexture.setAlpha(1.5f);

myTexture.setRotation(45.0f);

Anroid TextureView Tutorial

myTexture.setAlpha(1.0f);

myTexture.setRotation(90.0f);

Anroid TextureView Tutorial

可参考:
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1213/2153.html
http://blog.sina.com.cn/s/blog_4b968a420102wjqx.html

Camera2.0新API下获取预览图像数据盖天地不全,这经原是全全的,今沾破了,乃是应不全之奥妙也,岂人力所能与耶!愿来者补充1.使用Camera2.0进行预览,这部分就不介绍了。可以参考这里,这篇... 来自: u010277233的博客 解决办法:开启硬件加速如果是在Activity里面,可以直接在AndroidManifest里面设置android:hardwareAccelerated=”true”,也可以在onCreateset... 来自: WeLoveSunFlower的专栏 SurfaceView和TextureViewSurfaceView和TextureView都继承自android.view.View类。它们可以从单独的线程中绘制和渲染,这是与其他视图的主要区别。C... 来自: 郭风朴(guofengpu)的Android影音专栏 TextureView算是一个比较好用的视频控件,能拖拽和放大缩小。不过对它的生命周期都没什么研究一直以为和SurfaceView差不多,可是最近在其他手机上测试的时候发现并不是这样的,用Textur... 来自: 红色与青色 一开始做这个控件的时候我用的是SurfaceView,但是我发现我无法将它放到中间的某一层,因为它拥有独立的绘图表面,所以最终选用了TextureView,需要注意的是TextureView必须在硬件... 来自: boguesfei的博客 SurfaceView和TextureView均继承于android.view.View,与其它View不同的是,两者都能在独立的线程中绘制和渲染,在专用的GPU线程中大大提高渲染的性能。一、Surf... 来自: yuxing_zhong的专栏 编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识、前端、后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过!如果你想显... 来自: he_yun_c的博客 android TextureView的出现解决了几大问题:(1)listview,scrollview中可以加入textureview实现边播放边滚动;(2)mMediaPlayer.setSurf... 来自: mxy2002924的专栏 SurfaceView,GLSurfaceView,SurfaceTexture以及TextureView是Android当中名字比较绕,关系又比较密切的几个类。本文基于Android5.0(Loll... 来自: Red风信子的博客 IfyouwanttodisplayalivevideostreamoranycontentstreamsuchasvideooranOpenGLscene,youcanuseTextureViewp... 来自: 小许子的博客 为什么用surfaceTexture不用surface来展示呢?ICS之前都用的是surfaceview来展示video或者openGL的内容,surfacaviewrender在surface上,t... 来自: wust小吴 几个注意事项:1、TextureView是Android4.0之后加入的,低版本么这个类。TextureView必须工作在开启硬件加速的环境中,也即配置文件里Activity的设置项里:android... 来自: u010775683的博客 一、算数运算numpy.add():数组相加numpy.subtract():数组相减numpy.multiply():数组相乘numpy.devide():数组相除importnumpyasnpA=... 来自: u011587322的博客 转载注明出处:http://blog.csdn.net/u010181592/article/category/5893483文章出自我不只是看客的博客 TextureView+MediaPlayer... 来自: 我不只是看客的博客 使用SurfaceView的坑问题描述由于工作需要,需要开发相机界面,一开始的时候使用SurfaceView,开发完成后发现存在一些问题。一、很多手机activity页面切换都有动画(我使用测试的小米... 来自: Jesse_liao的博客 1、简介应用程序的视频或者opengl内容往往是显示在一个特别的UI控件中:SurfaceView。SurfaceView的工作方式是创建一个置于应用窗口之后的新窗口。这种方式的效率非常高,因为Sur... 来自: HardWorkingAnt的博客 TCP网络传输深层原理分析TCP网络传输深层原理分析TCP网络传输深层原理分析TCP网络传输深层原理分析TCP网络传输深层原理分析TCP网络传输深层原理分析TCP网络传输深层原理分析TCP网络传输深层原理分析TCP网络传输深层原理分析TC... 初识多线程和原理分析在什么情况下使用多线程​使用多线程的情况主要是解决程序的堵塞问题,调高CPU的使用率提升程序的性能,说到底多线程是解决的是等待的问题。多线程的创建方式​主要有三种:继承Thread... 来自: 梦之队 SurfaceView和TextureView均继承于android.view.View与其它View不同的是,两者都能在独立的线程中绘制和渲染,在专用的GPU线程中大大提高渲染的性能。一、Surfa... 来自: ation_work的专栏 在Android系统中,有一种特殊的视图,称为SurfaceView,它拥有独立的绘图表面,即它不与其宿主窗口共享同一个绘图表面。由于拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独... 来自: 老罗的Android之旅 SurfaceView:模板代码:publicclassSurfaceViewTextextendsSurfaceViewimplementsSurfaceHolder.Callback,Runnab... 来自: pgg_cold的博客 前言在Redis中,字典是一种运用特别广泛的数据结构,基本上各个功能模块都有使用到。主要用途是两个方面作为数据库键空间作为Hash类型键的底层实现之一目录字典的使用示例字典的底层结构和源码解析Reha... 来自: weixin_43555803的博客 SurfaceView是什么?SurfaceView优点及缺点?SurfaceView中双缓冲?TextureView是什么?TextureView优点及缺点?两者的性能相比如何?播放器应该选择谁?S... 来自: 逆流的鱼yuiop 本人作为一名Android新手,最近在在开发一款有关吹画的小游戏,为了实现吹画的过渡动画以及画面更新效果,本人在TextureView和SurfaceView之间纠结了很长时间,所以写了这篇博客来和大... 来自: lrh_12580的博客 最近,在修改Android4.4的原生相机Camera2,很习惯的去寻找SurfaceView,结果任凭我使用grep还是ack,都无法搜索到SurfaceView,最后还是通过代码CameraAct... 来自: AppleEngineer 先在空间记录些自己的平时研究的一些东西,既是个备忘录,也为以后CSDN的博客积攒些素材吧。        Textureview是google在android4.0后推出的一个新的控件,网上关于这方面... 来自: First_code的专栏 Google自Android4.0出了TextureView,为什么推出呢?就是为了弥补Surfaceview的不足,另外一方面也是为了平衡GlSurfaceView,当然这是本人揣度的。关于Text... 来自: iavstream官方博客 ImageView显示图片在Android平台上,显示图片的方式有很多种,其中最为简单的就是ImageView。1.在lyaout布局中,声明好ImageView&amp;amp;amp;amp;am... 来自: 三木仔 Camera2在预览的TextureView上画矩形盖天地不全,这经原是全全的,今沾破了,乃是应不全之奥妙也,岂人力所能与耶!愿来者补充使用手机摄像头进行人脸检测,对图像进行处理然后,画出矩形在预览的... 来自: u010277233的博客 1.引言如果你想显示一段在线视频或者任意的数据流比如视频或者OpenGL场景,你可以用android中的TextureView做到。1).TextureView的兄弟SurfaceView应用程序的视... 来自: 安辉 一、引言在经过将近半个月的调研开发,我终于算是对“Android短视频开发”入门了。为了给自己一个总结,也为了把自己潜心研究的成果分享出来,我决定写下这篇blog。播放器已经封装好,结构很清晰,直接调... 来自: 你关注了我,是个概率极低的事件...... 一、前言在前面的博客中Camera拍照中我们其实已经介绍过如何通过SurfaceView实现Camera的预览;今天闲着没事就写写怎样通过TextureView实现Camera预览,并介绍下Textu... 来自: zhang_jun_ling的博客 SurfaceViewAndroid有一个组件叫SurfaceView,是一个单独的组件,但是并不是和其他常见组件一样提供特别的功能(比如图片浏览,输入字符等等),就是一个空组件。那么这个有什么用呢。... 来自: super_zq的博客 TextureView在4.0(APIlevel14)中引入。它可以将内容流直接投影到View中,可以用于实现Livepreview等功能。和SurfaceView不同,它不会在WMS中单独创建窗口,... 来自: XingLiu's Blog API 21中将原来的camera API弃用转而推荐使用新增的camera2 API,这是一个大的动作,因为新API换了架构,让开发者用起来更难了。 先来看看camera2包架构示意图: 来自: 懒人的技术笔记 原理上一篇文章,已经说过了,大家可以参考一下,Faster-Rcnn进行目标检测(原理篇)实验我使用的代码是python版本的Faster Rcnn,官方也有Matlab版本的,链接如下:py-fas... 来自: GavinZhou的博客 今日遇见一个开超市的朋友,真没想到在高校开超市一个月可以达到月净利润50K,相比起我们程序员的工资,真是不可同日而语,这个世道啊,真是做程序员不如经商开超市,我们高科技的从业者,真是造原子弹不... 来自: 尹成的技术博客 1. 前言 隐马尔科夫HMM模型是一类重要的机器学习方法,其主要用于序列数据的分析,广泛应用于语音识别、文本翻译、序列预测、中文分词等多个领域。虽然近年来,由于RNN等深度学习方法的发展,HMM模型... 来自: tostq的专栏 最近在做爬虫的时候遇到了一个问题,在用requests的session方法保持cookie的时候发现requests不能保持手动构建的cookie。起初以为requests只能自动保持由服务器返回的s... 来自: falseen的博客 安装: yum install qemu 创建image文件: qemu-img create -f qcow2 guest.qcow2 3G 安装linux: 1)下载一个镜像文件,http:... 来自: 务远的博客 nginx是个好东西,Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambl... 来自: maoyuanming0806的博客 前段时间看了一些关于LSTM方面的论文,一直准备记录一下学习过程的,因为其他事儿,一直拖到了现在,记忆又快模糊了。现在赶紧补上,本文的组织安排是这样的:先介绍rnn的BPTT所存在的问题,然后介绍最初... 来自: 天道酬勤,做一个务实的理想主义者 问题场景描述整个项目通过Maven构建,大致结构如下: 核心Spring框架一个module spring-boot-base service和dao一个module server-core 提供系统... 来自: 开发随笔 测试环境莫名其妙有几条重要数据被删除了,由于在binlog里面只看到是公用账号删除的,无法查询是那个谁在那个时间段登录的,就考虑怎么记录每一个MYSQL账号的登录信息,在MYSQL中,每个连接都会先执... 来自: 路在脚下 什么是filtercache?     solr应用中为了提高查询速度有可以利用几种cache来优化查询速度,分别是fieldValueCache,queryResultCache,documentC... 来自: kuyuyingzi的专栏 有些时候,我们的输入不是标准的图像,而是其它一些格式,比如:频谱图、特征向量等等,这种情况下LMDB、Leveldb以及ImageData layer等就不好使了,这时候我们就需要一个新的输入接口——... 来自: shuzfan的专栏 本文为朴素贝叶斯的实践和进阶篇,先丢了点干货,总结了贝叶斯方法的优缺点,应用场景,注意点和一般建模方法。紧接着对它最常见的应用场景,抓了几个例子,又来了一遍手把手系列,不管是对于文本主题分类、多分类问... 来自: 寒小阳 Java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/conn/scheme/SchemeRegistry; Android方法数methods超过65536 Android快速点击的屏蔽和多弹出框的拦截 Android Studio最全插件整理 Android 引导、图片轮播控件(BGABanner) u013068887: [reply]d745282469[/reply] android系统版本问题吧,有些是在AndroidManifest.xml没有效果的,用java代码控制,写权限判断,这个百度搜一下就有很多解决方案的

Android锁屏状态下保持后台唤... d745282469: <uses android:name="android.permission.DEVICE_POWER"> 这个权限无法找到。

Android开发,MapBox地... dzbdzbdzbdzb: 请问大神,mapbox怎样加载wmts服务啊,怎样加载天地图呢

Android开发,MapBox地... jixiexianquweiketuo: [reply]u012920206[/reply] 新建一个rastersource和rasterlayer然后添加

Android开发,MapBox地... jixiexianquweiketuo: [reply]u013068887[/reply]