当前位置: 编程技术>移动开发
本页文章导读:
▪DLNA學習瞭解1 DLNA學習瞭解一 最近要研究DLNA了,網上的資料基本上都是介紹dlna 是什麼,但是基本上沒有什麼框架介紹,什麼的,根據個人查找的資料學習了一通
在此介紹分享出來。
首先需要.........
▪ 解决requestFeature() must be called before adding content异常 解决requestFeature() must be called before adding content错误
刚才做开发的时候遇到了这样的问题,
java.lang.RuntimeException:Unable to start activity ComponentInfo
经常查找原来是添加
取消标题取消标题的代码.........
▪ 高德mapOverlay的应用以及照相功能的实现 高德地图Overlay的应用以及照相功能的实现 暑假第二十一天,今天天气有点小热,长时间对着电脑眼睛还真有点不适应,下午刚刚出地下室吃饭的时候,两眼眺望了一下远方,就感.........
[1]DLNA學習瞭解1
来源: 互联网 发布时间: 2014-02-18
DLNA學習瞭解一
最近要研究DLNA了,網上的資料基本上都是介紹dlna 是什麼,但是基本上沒有什麼框架介紹,什麼的,根據個人查找的資料學習了一通
在此介紹分享出來。
首先需要瞭解的是 dlna是什麼 ?
1DMP从MDS上找到movies,并播放
2DMC发送photos到DMR,让其播放
3 DMC发现DMS的媒体文件,并指定让某个DMR播放
概念稍候解释...
DMR和DMP的区别在于,DMR仅仅是个被动的播放器,不能搜索DMS。而DMP由于携带了DMC,所以可以搜索DMS
为什么要画成这种像插槽一样的?后面可知,DMS等仅仅是容器,
DLNA Service
AVTransport:传输服务,提供媒体文件
传输,播放控制等功能。
ContentDirectory:内容目录,用于提供媒体文
件浏览,检索,获取媒体文件信息等功能。
ConnectionManager:连接管理,用于提供连
接方面的管理,例如获取源/目的双方支持
的MIME格式信息。
RendringControl:渲染控制,用于播放时的一
些渲染控制,如调节音量,调节亮度等。
厂商也可自定义服务
1DLNA是一个基于TCP/IP的协议
2 首先要有UPNP协议族,基于HTTP
3 实际上DLNA基于SOAP
4 SSDP:simple service discovery protocol 依赖HTTPU/HTTPMU
5 GENA:Generic EventNotification Architecture
6SOAP Simple Object AccessProtocol
[2] 解决requestFeature() must be called before adding content异常
来源: 互联网 发布时间: 2014-02-18
解决requestFeature() must be called before adding content错误
刚才做开发的时候遇到了这样的问题, java.lang.RuntimeException:Unable to start activity ComponentInfo
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
initButton();
videoView = (VideoView) this.findViewById(R.id.rtsp_player);
videoView.setOnErrorListener(videoErrorListener);
videoView.setMediaController(new MediaController(this));
java.lang.RuntimeException:Unable to start activity ComponentInfo
刚才做开发的时候遇到了这样的问题, java.lang.RuntimeException:Unable to start activity ComponentInfo
经常查找原来是添加
取消标题取消标题的代码的原因
requestWindowFeature(Window.FEATURE_NO_TITLE);// //取消标题
setContentView(R.layout.onlinevideo);//Activity样式文件,一定要写在中间this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
initButton();
videoView = (VideoView) this.findViewById(R.id.rtsp_player);
videoView.setOnErrorListener(videoErrorListener);
videoView.setMediaController(new MediaController(this));
java.lang.RuntimeException:Unable to start activity ComponentInfo
这是因为:
android java的执行顺序有关!目前遇到的这个问题就是因为在系统运行开始的时候就已经调用父类的构造方法,接着调用setContentView方法展示视图界面。R.layout.main是R.java资源类中的一个属性。当你在调用这个方法之后在声明Widget就会报:android.util.AndroidRuntimeException: requestFeature() must be called before adding content
所以前面的那三句中加载Activity的样式的那句代码一定要写在中间。
[3] 高德mapOverlay的应用以及照相功能的实现
来源: 互联网 发布时间: 2014-02-18
高德地图Overlay的应用以及照相功能的实现
3.看看主活动的内容GaodeMapTestActivity.java
4.看看相机实现的活动TakePhotos.java
暑假第二十一天,今天天气有点小热,长时间对着电脑眼睛还真有点不适应,下午刚刚出地下室吃饭的时候,两眼眺望了一下远方,就感觉小有压力,眼睛和头都有点不舒服,哎!程序员真苦逼啊!!!伤不起的还是我们这群程序员。。。嘿嘿,废话不多说了看看今天都学的什么,今天主要学习的是实现高德地图的图层覆盖方法和相机照相的功能的实现过程
1.首先看一下布局mapview.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:autonavi="http://schemas.android.com/apk/res/com.AMap" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ImageButton android:id="@+id/imagebutton" android:layout_width="45dp" android:layout_height="45dp" android:src="/blog_article/@drawable/camera/index.html"/> <com.amap.mapapi.map.MapView android:id="@+id/mapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> </LinearLayout>2.camera.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <SurfaceView android:id="@+id/suruface" android:layout_width="fill_parent" android:layout_height="390dp" /> <ImageButton android:id="@+id/iamge" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:src="/blog_article/@drawable/a/index.html" /> </LinearLayout>
3.看看主活动的内容GaodeMapTestActivity.java
package com.wang; import com.amap.mapapi.core.GeoPoint; import com.amap.mapapi.map.MapActivity; import com.amap.mapapi.map.MapController; import com.amap.mapapi.map.MapView; import com.amap.mapapi.map.Overlay; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Paint.Style; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; public class GaodeMapTestActivity extends MapActivity { private MapView mapView; private MapController mapController; private GeoPoint point; private ImageView image; /** *显示栅格地图,启用内置缩放控件,并用MapController 控制地图的中心点及Zoom 级别 */ protected void onCreate(Bundle savedInstanceState) { // 设置地图为矢量模式 this.setMapMode(MAP_MODE_VECTOR); super.onCreate(savedInstanceState); setContentView(R.layout.mapview); mapView = (MapView) findViewById(R.id.mapView); // 设置启用内置的缩放组件 mapView.setBuiltInZoomControls(true); // 得到mapview的控制权,可以用它控制盒驱动平移和缩放 mapController = mapView.getController(); // 用给定的经纬度构造一个GeoPoint,单位是微度(度* 1E6) 得到南阳理工学院的经纬度 // * 1E6 非常重要,这样可以把地图的下面显示出来,不然就光有自己画的图层了 point = new GeoPoint((int) (32.973657928606265 * 1E6), (int) (112.54251837730408 * 1E6)); // 设置地图的中心 mapController.setCenter(point); // 设置地图的缩放级别 mapController.setZoom(12); // 自定义Overlay可以实现点,线,面的叠加。 mapView.getOverlays().add(new Overlay() { /**** * 画布类持有“画"的功能。绘制一些东西,你需要四个基本组件: 一个位图来保持像素,画布主机平局调用(写为位图), * 绘图原语(例如。,路径,Rect文本,位图), 和一个油漆(描述的颜色和风格的画)。 ****/ public void draw(Canvas canvas, MapView mapView, boolean shadow) { super.draw(canvas, mapView, shadow); // 创建一个screenpPoint对象 Point screenpPoint = new Point(); // 得到屏幕上的像素 mapView.getProjection().toPixels(point, screenpPoint); // 位图对象创建从各种来源,包括文件、流、和byte-arrays。解码位图,得到图片资源 Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.da_marker_red); // 画指定的位图,同其主要/左角(x,y),使用指定的油漆,改变当前的矩阵。 canvas.drawBitmap(bmp, screenpPoint.x, screenpPoint.y - 50, null); // 画文字 Paint painttext = new Paint(); painttext.setTextSize(18); painttext.setColor(Color.RED); canvas.drawText("南阳理工学院", screenpPoint.x, screenpPoint.y, painttext); // 画圆 Paint mcirclePaint = new Paint(); // s设置普通显示效果 mcirclePaint.setAntiAlias(true); mcirclePaint.setColor(Color.BLUE); // 设置透明度的 mcirclePaint.setAlpha(50); mcirclePaint.setStyle(Style.FILL); canvas.drawCircle(screenpPoint.x + 150, screenpPoint.y, 50, mcirclePaint); // 画直线 Paint painline = new Paint(); painline.setColor(Color.RED); // 边界宽度 painline.setStrokeWidth(3.0f); // 轻画 painline.setStyle(Paint.Style.STROKE); canvas.drawLine(screenpPoint.x - 100, screenpPoint.y, screenpPoint.x, screenpPoint.y - 100, painline); } @Override public boolean onTap(GeoPoint arg0, MapView arg1) { // TODO Auto-generated method stub return super.onTap(arg0, arg1); } }); image = (ImageView) findViewById(R.id.imagebutton); image.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(GaodeMapTestActivity.this, TakePhotos.class); startActivity(intent); } }); } }
4.看看相机实现的活动TakePhotos.java
package com.wang; import java.io.FileOutputStream; import java.io.IOException; import android.app.Activity; import android.hardware.Camera; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.view.View.OnClickListener; import android.widget.ImageButton; public class TakePhotos extends Activity { private static final String TAG = "TakePhotos"; final int latchedOrientation = 90; /*** * 相机类是用于设置捕获图像设置,启动/停止预览,抓拍照片,和检索帧编码的视频。 这个类是一个客户端相机的服务,管理实际的相机硬件。 * **/ private Camera mCamera; // 处理打开相机关闭相机,及图片尺寸的大小 private SurfaceHolder.Callback mSurfaceListener = new SurfaceHolder.Callback() { // 打开相机 public void surfaceCreated(SurfaceHolder holder) { mCamera = Camera.open(); Log.i(TAG, "Camera opened"); try { // 照相预览 mCamera.setPreviewDisplay(holder); } catch (Exception e) { e.printStackTrace(); } } // 停止预览 public void surfaceDestroyed(SurfaceHolder holder) { // 释放相机资源 mCamera.release(); mCamera = null; Log.i(TAG, "Camera released"); } // 获取相片改变的尺寸和格式 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // 得到相机的参数 Camera.Parameters parameters = mCamera.getParameters(); // parameters.setPreviewSize(width, height); // parameters.setPictureFormat(PixelFormat.JPEG); // jpeg quality菜单项设置 parameters.set("jpeg-quality", 85); // parameters.setRotation(latchedOrientation); mCamera.setParameters(parameters); // 开始预览 mCamera.startPreview(); Log.i(TAG, "Camera preview started"); Log.i(TAG, "width : " + width + " , height : " + height); } }; // 设备不支持自动对焦将收到一个“假的”回调到这个接口 ,实现自动对焦的功能 private Camera.AutoFocusCallback mAutoFocusListener = new Camera.AutoFocusCallback() { /** * 判断相机的自动对焦时调用完成。如果相机不支持自动对焦和自动对焦叫做, onAutoFocus会被立即调用成功的用假值设置为true。 * 常规的自动对焦没有锁auto-exposure和auto-white完成 * *****/ public void onAutoFocus(boolean success, final Camera camera) { Log.i(TAG, "AutoFocus : " + success); camera.autoFocus(null); /** * 触发异步捕获图像。相机服务将启动一系列的回调应用程序作为图像捕获的进展 。快门回调后出现在照片拍摄。 * 这可以用来触发一个声音,让用户知道形象已经被捕获。就是听到的卡卡的声音 * */ camera.takePicture(mShutterListener, null, mPictureListener); new Thread() { @Override public void run() { try { // 睡眠3s Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } camera.startPreview(); } }.start(); } }; // 图像捕捉的回调方法 private Camera.ShutterCallback mShutterListener = new Camera.ShutterCallback() { public void onShutter() { Log.i(TAG, "onShutter"); } }; // 照片回调 声明一个PictureCallback对象 private Camera.PictureCallback mPictureListener = new Camera.PictureCallback() { // 获取图像数据可用时,调用一个图片是采取之后。数据的格式取决于上下文和相机的回调。 public void onPictureTaken(byte[] data, Camera camera) { Log.i(TAG, "Picture taken"); // 数据写到输出流,到一个文件。如果输出文件存在, // 也可以替换或附加到。如果它不存在,将会创建一个新文件 FileOutputStream fos = null; try { // 写入到SD卡中 fos = new FileOutputStream("/sdcard/TakePhotos.jpg"); fos.write(data); } catch (IOException e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } }; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Window win = getWindow(); // 设置全屏 win.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); // 没有标题 requestWindowFeature(Window.FEATURE_NO_TITLE); requestWindowFeature(Window.FEATURE_PROGRESS); setContentView(R.layout.camera); /**** * SurfaceView 提供专用的绘图表面上嵌入视图层次。 负责放置在正确的位置的表面在屏幕上 ,以便在窗口后面是握着它的 * 允许其表面显示的 访问底层表面是通过SurfaceHolder接口,可以通过调用getHolder检索()。 * **/ // 实例化组件 SurfaceView surface = (SurfaceView) findViewById(R.id.suruface); // 访问底层表面是通过SurfaceHolder接口 SurfaceHolder holder = surface.getHolder(); // 添加一个回调接口 holder.addCallback(mSurfaceListener); // 在需要的时候自动设置。 holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 实例化组件 ImageButton button = (ImageButton) findViewById(R.id.iamge); // 为图片设置监听事件,按下图片后可以进行拍照 button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mCamera != null) { mCamera.autoFocus(mAutoFocusListener); } } }); } }5.亲!最重要的别忘了添加权限哦!
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.wang" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".GaodeMapTestActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".TakePhotos" > </activity> </application> <!-- 高德地图的一些权限 --> <!-- 1.获取粗略位置的权限 2.获取精确位置的权限 3.联网的权限 4.获取网络状态的权限--> <!-- 5.外部存储的权限 6.获取图层状态的权限 7. 改变wifi状态的权限 8.获取wifi状态的权限 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" > </uses-permission> <uses-permission android:name="android.permission.INTERNET" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > </uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" > </uses-permission> <uses-permission android:name="android.permission.READ_PHONE_STATE" > </uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" > </uses-permission> <!-- 照相机的一些权限 --> <!-- 1.获取相机的权限 2.获取相机硬件设施的权限 3.获取自动对焦的权限 4,获取相机硬件刷新频率的权限 --> <!-- --> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-feature android:name="android.hardware.camera.flash" /> </manifest>6.由于高德地图需要导入第三方jar包MapApi.jar(解决这个问题,可以看我以前的关于第三方jar包的导入方法)和一个动态链接库libminimapv320.so,解决这个问题可以直接复制
7,运行的结果如图,由于模拟器没有后置摄像头,所以第二章图片有一部分是白的
8.相关代码可以参考http://download.csdn.net/detail/wjky2014/4425694
最新技术文章: