BlackBerry 视频录制编程

作者: 俞伟

 

 

B lackB e r r y 录制编 概述

 

 

Bla c kBer r y   5 .0   平台以及 前的 本对多 体的支 依赖于 JS R   135 ,也就 标准 J2 M E 平台

M M A P I Bla c kB er r y 手机上录 视频也 M M A P I 支持 3 g pp 视频 支持的 频编 码包括   M P E G - 4 , H 263 , H 264 ,   音频编码包括   AAC , P C M , A M R 具体的 频音 码支 依黑 莓机型而

 

Bla c kBer r y 录制编 包括以 几部分:

 

1 .     / 选定手机对视频格 / 编码的支持

2 .     / 存储视频

3 .     回放已录制的视频

 

 

/ 选定视 / 编码

 

 

通过系统 供的 A P I 以获 机型视 支持的所有 规格:

 

 

 

S t r in g enc o di n g sS t r in g = S ys t em. g etP r op er t y ( " video .en c o di ng s " );

 

enc o di ng s S t r in g   包含了 部能够 持的视 规格, 它是一个   S t r in g 不能够 接使用,

需要进一 解析 下代码 析视频 格,并 格列表:

 

 

/**

*   黑莓 机所支 的视屏 格列表

*/

p ub l i c s t a t i c S t r in g[ ] g e t Vid eoE nc o di n g s ( )

{

//   获取黑 手机设 支持的 频格 / 编码

S t r in g enc o di n g sS t r in g = S ys t em. g etP r op er t y ( " v id eo. enc o di ng s " );

 

//   如果没 支持的 频编码 返回空

i f ( enc o di ng s S t r in g == n u l l )

{

r et u r n n u ll ;

}

 

 

//   解析出 频规格

Ve c t o r en c o di ng s = n e w Vec t o r() ;

i n t s t ar t = 0 ;

i n t s pa c e = en c o di ng sS t r in g .i nd e xO f ( ' ' );

 

 

whil e ( s pa c e ! = - 1 )

{

enc o di n g s .a dd E lem ent ( en c o di ng sS t r in g .s u bs t r in g ( s t ar t , s pa c e) ) ;

s t ar t = s pa c e + 1 ;

s pa c e = enc o di n g sS t r in g .i nd exOf ( ' ' , s t ar t ) ;

}

en c o di ng s .a dd E lem en t ( enc o di ng s S t r in g .s ubs t r in g ( s t ar t ,    en c o di ng sS t r in g .l en gt h())) ;

 

 

S t r in g[ ] enc o di n g Arr ay = n e w S t r in g [ enc o di n g s . s iz e( ) ] ;

en c o di ng s .c o p yInto ( enc o di n g Arr ay) ;

r e t u r n en c o di ng Arr ay;

}

 

 

 

 

 

解析后的 频规 例如下 示:

 

 

enc o di ng= vid eo/3 g pp &mo de =st an da r d

enc o di ng= vid eo/3 g pp &mo de =mm s”

enc o di ng= vid eo/3 g pp &w id t h=480 &hei g ht =360 &video _ c o dec = M P E G - 4 &au dio _c o de c =A M R

enc o di ng= vid eo/3 g pp &w id t h=176 &hei g ht =144 &video _ c o dec =H263 &au dio _c o d ec =A MR

enc o di ng= vid eo/3 g pp &w id t h=480 &hei g ht =360 &video _ c o dec =H263 &au dio _c o d ec =AA C

enc o di ng= vid eo/3 g pp &w id t h=480 &hei g ht =360 &video _ c o dec =H264 &au dio _c o d ec =AA C

 

 

l      enc o di ng 表示视 格式

l      mo de 表示播放模式 模式会 动设置 幕尺

l      “w id t h 表示屏幕宽度

l      hei g h t 表示屏 高度

l      video _c o de c 表示 频编码

l      au dio _c o de c 表示音频

 

视频规格 图所示:

 

 

   

 

 

 

 

 


、存 视频

 

 

 

录制视频 要用到 P la y er Vid eoC o nt r o l Re c o r dC o nt r o l By t eAr r a yOu t pu t S t r eam 使用 P la y er 打开摄像头, Vid eoC o nt r o l   将捕捉的视频显示到屏幕上 R ec o r dC o nt r o l   控制录制过程, Byt eAr r a yOu t pu t S t r eam   作为视 录制的 。以下三 段代码范 分别为 / 启动 像头, 开始录制 和保 录制的 频。

 

 

/**

*   构造一 屏幕 示和录 摄像头 制的视频

*/

p u bli c Vid eoR ec o r di ng S c r ee n( S t r in g en c o di ng , S t r in g f il e P at h)

{


t r y {


 

//   开始 捉视频

// enc o di n g   一部 到的视 规格

_ pl ayer = j avax.m i c r o edi t io n.m edi a. M an ag er . c reat eP l a y er ( " c ap t ur e : //vid eo? " + en c o di ng ) ;

_ pl ayer .s t ar t () ;

 

 

_ video C o nt r o l = ( Vid eoC o nt r o l) _pl ayer .g e t C o nt r o l( " Vid eoC o nt r o l" );

_r e c o r dC o nt r o l = ( Re c o r dC o nt r o l) _pl ayer .ge t C o nt r o l( " Re c o r dC o nt r o l" );

 

//   捉的视 显示在 F iel d 控件上

F iel d vid eoF iel d = ( F iel d)

_v id eoC o nt r o l .i ni t Dis pl ayM o de( Vid eoC o nt r o l. U SE _G U I_P RIM IT IVE ,

" net .r im .d ev i c e.ap i. ui .F iel d" ) ;


 

 


t r y {

 

 

 

 

 

}


 

//   视频尺 为全屏

_ video C o nt r o l .s et Dis pl ayS iz e( Dis pl ay .g et W id t h () , Dis pl ay.g et H ei g ht ( ) ) ;


c a t c h ( M edi aE x c ept io n m e )

{ }

ad d( videoF iel d) ;

 

//   缓存, 捉到的 频将写 缓存

_ou t S t r eam = n e w By t eArr ayO ut pu t S t r ea m () ;

_v id eoF il e = f il eP at h ;

 

 

s t ar t Re c o r d() ;

}

 

 

 


 

 

 

c a t c h ( E xc ept io n e )

{

// Dis pos e o f t he pl a ye r if it w as c r ea t ed

i f ( _pl ayer ! = n u l l )

{

_pl ay er .c los e( ) ;

}

_pl ayer = n u ll ;

 

 

del et eA ll () ;

r emo ve A ll M enuI t ems () ;

 

 

Vid eoRe c o r di ng Demo . err o rD ia l o g ( e. t oS t r i ng ()) ;

}

}

 

 

 

代码 置并启 摄像

 

 

 

/**

*   录制

*/

p r iva t e vo i d s t ar t Re c o r d ()

{


t r y

{


 

 

 

i f ( ! _pendi ng C omm it )

{


//   重置缓存

_ou t S t r eam .r eset () ;

 

//   将缓存 为录制

_r e c o r dC o nt r o l .s et Re c o r dS t r ea m ( _ou t S t r eam );

 

 

_p end in g C omm it = t r u e ;

_ c omm itt ed = f a l s e ;

}

//   录制

_r ec o r dC o nt r o l .s t ar t Re c o r d() ;

_r ec o r di ng = t r u e ;

}

 

 

 


 

 

c a t c h ( E xc ept io n e )

{

Vid eoRe c o r di ng Demo . err o rD ia l o g ( e. t oS t r i ng ()) ;

}

}

 

代码 始录制

 

 

 

 

/**

*   录像

*/

p r iva t e vo i d c omm itRe c o r di ng ( )

{


t r y

{


 

 

 

//   这是最 键的一 ,保存 制的视频

_r ec o r dC o nt r o l .c omm it() ;

 

//   参数

_pendi ng C omm it = fa l s e ;

_c omm i tt ed = t r u e ;

_r ec o r di ng = fa l s e ;

 

//   视频数

b yt e [ ] d at a = _ou t S t r eam .t o Byt eArr ay() ;

 

//   件的形 保存视频

F il eC o nn ec t io n f c o nn = (F il eC o nn ec t io n) C o nn ec t o r .o p en ( _ videoF il e );

i f (f c o nn .exis t s ()) {

f c o nn .d elet e( ) ;


}

 

 

f c o nn .c r ea t e( ) ;

Ou t pu t S t r eam o s = f c o nn .o penO ut pu t S t r eam () ;

os .w r ite( da t a) ; os .f lus h() ; os .c los e( ) ; f c o nn .c los e( ) ;

 

 

 

 


 

 

Di alo g .a le rt ( " C omm i tt ed " );

}

c a t c h ( E xc ep t io n e )

{

VideoRe c o rd i n g Dem o .er r o rD ia l o g ( " Re c o r dC o nt r o l#c omm it( ) t hr ew " + e.t oS t r in g ()) ;

}

}

 

 

 

代码 / 存储 频。

 

 

 

 

放已录 的视频

 

 

前一 录制的 频以文件 保存 手机目录中, 回放视频需要 路径,   入文件, 使用 P la y er F iel d 进行播 。代码 下:

 

 

/**

*   视频 放屏幕 按指定 径装载

*/

P u b li c     Vid eoPla ybac kS c r ee n( S t r in g f il e)

{

b o ol e a n no t E m pt y ;

 

//   检测给 路径是 有媒体

t r y

{

F il eC o nn ec t io n f c o nn = (F il eC o nn ec t io n) C o nn ec t o r . o p en (f il e) ;

no t E m pt y = f c o nn .exis t s ( ) && f c o nn .f il eSi z e( ) > 0 ;

f c o nn .c los e( ) ;

}

c a t c h ( IO E xc e pt io n e )

{

Di alo g .a le r t ( " E xc ep t io n w hi le ac c ess in g t h e video f il esi z e: /n/n" + e) ;

no t E m pt y = fa l s e ;

}

 

 

 

 

 

 

 


 

 

//   如有媒 文件并 内容, 始化界 进行播放

i f ( no t E m pt y )

{


t r y

{

 

 

 

 

 

}


 

 

 

//   创建   Vid eo P la ye r

_ video P la y er = j a vax.m ic r o edi t io n.m e di a. M an ag er . c rea t eP l a y er (f il e) ;

in itS c r ee n() ;


c a t c h ( E xc ept io n e )

{


 

 

}

}

e l s e

{


Di alo g . a le rt ( " E xc ept io n w hi le in i t ia li z in g t he pl ayb ac k video pl ayer /n/n " + e) ;


add( n e w L ab elF iel d( " T he v id eo f il e you ar e t r yin g t o pl a y is emp t y " ));

}

}

 

 

 

 

 

使 给定 路径创建     _v i deo P l a y er

 

 

p r i va t e v oi d in itS c r ee n( ) t h r o w s E x c ept io n{

_v id eoPla ye r .r eali z e( ) ;

 

//   注册媒 播放时 响应

_v id eoPla ye r .a dd P la ye r L is t ener( n e w P la y er L is t ener ( ) {

p u bli c v oi d pl ayerU pd at e( P la ye r pl ayer , S t r in g ev ent , Ob j e c t e ve nt Da t a) {

//   定义媒 文件播 完毕时 响应

i f ( ev ent == P la ye r L is t ener . EN D_O F _ M E DI A ) { U iA pp li c at io n.g e t U iA pp li c a t i o n () .i nvo keL a t er( n e w R un na bl e() {

p u bli c v o i d r un ( ) { Di alo g .a l ert ( " F in is hed pl ayin g " ); c los e( ) ;


 

 

 

 

 

}

} ) ;


}

} ) ;

}


 

 


 

 

//   获取   Vid eoC o nt r o l 得播放 频的   F iel d

_v id eoC o nt r o l = ( Vid eoC o nt r o l) _v id eoPla y er .g e t C on t r ol ( " Vid eoC o nt r o l" );

F iel d vFi eld = (F iel d) _v id eoC o nt r o l .i ni t Dis pl ay M o de( Vid eoC o nt r o l.US E _G U I_P RIM IT IVE ,

" ne t .r im .d ev ic e.ap i. ui .F i eld " );

ad d( vFi eld ) ;

 

 

//   获取   Vo lum eC o nt r o l 指定声 大小

Vo lum eC o nt r o l vo l = ( Vo lum eC o nt r o l) _v id eoPl ayer .get C on t r ol ( " Vo lum eC o nt r o l" );

vol .s e t L e ve l( 30 ) ;

}

 

 

 

 

 

 

初始 开始回 _v i deo P l a y er .r eali z e( )   获取视频文件 关信 放做好 备。

  _v i deo P l a y er                                     

_v i deo P l a y er   获取     Vid eoC o nt r o l Vi deo C o nt r o l   再返 回视屏播 所占     F ield 加这个

F iel d 到屏幕上 显示视 V ol um eC o nt r o l 定义 音大小 可以 _ v i deo P l a y er 取。

 

 


代码

 

 

 

V i deo R e co r d i n g S c r e e n. j a v a

 

 

pa c kage c om .r im .s am pl es. devi c e.video r e c o r di ng demo ;

 

 

im p o r t ne t .r im .d ev ic e.ap i. ui .*;

im p o r t ne t .r im .d ev ic e.ap i. ui .c o nt ai ner .* ; im p o r t ne t .r im .d ev ic e.ap i. ui .c om po nent. *; im p o r t ne t .r im .d ev ic e.ap i.s ys t em. Dis pl ay ;

 

 

im p o r t j avax.m ic r o edi t io n. io .C o nn ec t o r ;

im p o r t j avax.m ic r o edi t io n. io .f il e.F il eC o nn ec t io n;

im p o r t j avax.m ic r o edi t io n.m edi a. *;

im p o r t j avax.m ic r o edi t io n.m edi a. c o n t r o l. *;

 

 

im p o r t j ava.io .By t eArr ayO ut pu t S t r eam ; im p o r t j ava.io .By t eArr ayIn pu t S t r eam ; im p o r t j ava.io .O ut pu t S t r eam ;

 

 

/**

* T hi s s c r ee n al lo w s t he us er t o r ec o r d vid eos t o a f il e o r t o a s t r eam and

* enab les t h e us er t o o pen t he Video P la yba c kS c r ee n t o pl ay t he r e c o r ded vid eo.

*/

p u bli c c l a s s Vid eoRe c o r di ng S c r e e n exte n d s M ai nS c r ee n

{

p r iva t e b o ol e a n _p endi ng C omm it ; p r iva t e b o ol e a n _ c omm it t ed ; p r iva t e b o ol e a n _r e c o r di ng ;

 

 

p r iva t e S t r in g _v id eoF il e ;

 

 

p r iva t e P la ye r _pl a ye r ;

p r iva t e Vid eoC o nt r o l _v id eoC o nt r o l ; p r iva t e Re c o r dC o nt r o l _r ec o r dC o nt r o l ; p r iva t e b o ol e a n _dis pl ay Vis ib le ;

p r iva t e Byt eArr ayO ut pu t S t r eam _ou t S t r eam ;

 

 

 

p ub l i c Vid eoRe c o r di ng S c r ee n( S t r in g enc o di n g , S t r in g f il eP at h)

{

 


 

 

i f ( enc o di ng == nu l l )

{

t h r o w n e w N ul lPoi n t er E xc ep t io n( " Vid eo e nc o di ng c an no t be nul l " );

}

i f (f il eP at h == n ull )

{


 

 

}

 

 

t r y

{


t h r o w n e w N ul lPoi n t er E xc ep t io n( " F il e pa t h c an no t be nu ll " );


//   开始 捉视频

// enc o di n g 频规格

_pl a ye r = j avax.m ic r o edi t io n.m edi a. M an ag er . c reat eP l a y er ( " c ap t ur e: //vid eo? " + en c o di ng ) ;

_pl a ye r .s t ar t () ;

 

 

_ video C o nt r o l = ( Vid eoC o nt r o l) _pl ayer .g e t C o nt r o l( " Vid eoC o nt r o l" );

_r e c o r dC o nt r o l = ( Re c o r dC o nt r o l) _pl ayer .g et C o nt r o l( " Re c o r dC o nt r o l" );

 

//   将捕 的视频 示在 F iel d 件上

F iel d videoF iel d = (F iel d) _v id eoC o nt r o l .i ni t Dis pl ayM o de( Vid eoC o nt r o l. U SE _G U I_ P RIM IT IVE ,

" net .r im .d ev i c e.ap i. ui .F iel d" ) ;

 

 


t r y {

 

 

 

}


 

//   视频尺 为全屏

_ video C o nt r o l .s et Dis pl ayS iz e( Dis pl ay .g et W id t h () ,    Dis pl ay. g et H ei ght ( ) ) ;


c a t c h ( M edi aE x c ept io n m e ){

// s et Dis pl ayS iz e is no t s up po r t ed

}

ad d( videoF iel d) ;

 

//   缓存, 捉到的 频将写 缓存

_ou t S t r eam = n e w By t eArr ayO ut pu t S t r ea m () ;

_v id eoF il e = f il eP at h ;

 

 

s t ar t Re c o r d() ;

}

 

 

 

 

 

 

 


 

 

c a t c h ( E xc ept io n e )

{

// Dis pos e o f t he pl a ye r if it w as c r ea t ed

i f ( _pl ayer ! = n u l l )

{

_pl ay er .c los e( ) ;

}

_pl ayer = n u ll ;

 

 

del et eA ll () ;

r emo ve A ll M enuI t ems () ;

 

 

Vid eoRe c o r di ng Demo . err o rD ia l o g ( e. t oS t r i ng ()) ;

}

}

 

 

/**

* C omm its t h e c urr ent r e c o r di ng

*/

p r iva t e M enuI t em _ c omm it = n e w M enuI te m ( " C o m m it r ec o r di ng " , 0 , 0) {

p u bli c v oi d r un ( ) {

c omm it Re c o r di ng () ;

}

};

 

 

/**

* P la ys t he r e c o r di ng

*/

p r iva t e M enuI t em _pl ay Re c o r di ng = n e w M enuI t em ( "P la y r ec o r di ng " , 0 , 0) {

p u bli c v oi d r un ( ) {

// Cr eat e t he pl ayba c k s c r e en fr o m t he c h os en v id eo so ur c e

Vid eoPla yb ac kS c r ee n p la yba c kS c r ee n = n e w Vid eoPla yb ac kS c r ee n( _v id eoF il e );

 

 

// H id e t h e video f ee d s in c e w e c an no t di s pl ay v id eo fr o m t he c am er a

// and v id eo fr o m a f il e at t he s am e t im e.

_v id eoC o nt r o l .s et Vis ib le( f a l s e );

_dis pl ayVis ib le = fa l s e ;

 

 

U iA pp li c at io n.g e t U iA pp li c a t i on () .p us hS c r e en( pl ayba c kS c r e en) ;

}

};

 

 

 


 

 

/**

* Re s et s t h e r ec o r di ng

*/

p r iva t e M enuI t em _r ese t = n e w M enuI t em( " Re s e t r ec o r di ng " , 0 , 0) {

p u bli c v oi d r un ( ) {

t r y {

_r e c o r dC o nt r o l .r eset () ;

}

c a t c h ( E xc ept io n e ){

Vid eo Re c o r di ng Demo . err o rD i a lo g ( " R ec o r dC o nt r o l#r eset t hr ew " + e.t o S t r in g ()) ;

}

}

};

 

 

/**

*    S ho w s t he video dis pl ay

*/

p r iva t e M enuI t em _sho w Dis pl ay = n e w M enuI t em( " S ho w dis pl ay" , 0 , 0) {

p u bli c v oi d r un ( ) {

_v id eoC o nt r o l .s et Vis ib le( t r u e );

_dis pl ayVis ib le = t r u e ;

}

};

 

 

p r iva t e M enuI t em _hi de Dis pl ay = n e w M enuI t e m( " H id e dis pl ay" , 0 , 0) {

/* *

* @ s e e j a va.l an g .Run na bl e# r un ( )

*/

p u bli c v oi d r un ( ) {

_v id eoC o nt r o l .s et Vis ib le( f a l s e );

_dis pl ayVis ib le = fa l s e ;

}

};

 

 

p r i va t e M enuI t em _star t R ec o r d = n e w M enuI t em( " S t ar t r ec o r di ng " , 0 , 0) {

p u bli c v oi d r un ( )

{

s t ar t Re c o r d() ;

}

};

 

 

 


 

 

p r i va t e M enuI t em _sto pRe c o r d = n e w M enuI t e m( " S t o p r ec o r di ng " , 0 , 0) {

p u bli c v oi d r un ( ) {

s t o pRe c o r d() ;

}

};

 

 

p ub l i c b o ol e a n o nC los e() {

// S t o p c ap t ur in g v id eo fr o m t he c am er a

i f ( _pl ayer ! = n ul l ) {

_pl ayer .c los e( ) ;

}

r e t u r n su p e r .o nC los e( ) ;

}

p r o te c te d b o o l e a n o nS aveP r om p t ( ) {

// Su pp r ess t he s ave pr om p t

r e t u r n t r u e ;

}

 

 

p r o te c te d v o i d m ake M enu( M enu m enu, i n t ins t an c e) {

s u p e r .m ake M enu( m enu, ins t an c e) ;

i f ( _r e c o r di ng ) {

m enu. ad d( _sto pR ec o r d );


}

e l s e {

 

 

}


 

 

 

m enu. ad d( _star t R ec o r d );


 

 

i f ( _pendi ng C omm it ) {

m enu. ad d( _c omm i t );

m enu. ad d( _r eset );

}

i f ( _ c omm it t ed ) {

m enu. ad d( _pl ayR ec o r di ng );

}

 

 

i f ( _dis pl ayVis ib le ) {

m enu. ad d( _hi deDis pl ay ) ;


}

e l s e {

 

 

}

}


 

 

 

m enu. ad d( _sho w Dis pl ay );


 


 

 

p r o te c te d b o o l e a n in vokeA c t io n( in t a c t io n) {

s wi t c h ( a c t io n) {

c a s e A CT ION _IN V O KE : // Tr ac kba ll c li c k

i f ( _r e c o r di ng ) {

in t r espo ns e = Di alo g . a sk ( Di alo g . D_YE S_ N O , " Re c o r di ng paus ed.    C omm it r ec o r di ng ? " , Dia lo g . YE S ) ;

i f (r espo ns e == Dia lo g. YE S ) {

t h i s . c omm itR ec o r di ng () ;

}

}

r et u r n t r u e ; // W e' v e c o ns um ed t he ev ent

}

r e t u r n    s u p e r .i nvo k eA c t io n( ac t io n) ;

}

 

 

p r o te c te d v o i d o nVis ib il ityC ha ng e( b o ol e a n vis ib le) {

i f ( vis ib le && _pl a ye r ! = n ul l ) {

_v id eoC o nt r o l .s et Vis ib le( t r u e );

_dis pl ayVis ib le = t r u e ;

}

}

 

 

p r iva t e vo i d s t ar t Re c o r d( ){

t r y {

i f ( ! _pendi ng C omm it ) {

_ou t S t r eam .r eset () ;

 

//   将缓存 为录制

_r e c o r dC o nt r o l .s et Re c o r dS t r ea m ( _ou t S t r eam );

 

 

_p endi ng C omm it = t r u e ;

_ c omm itt ed = f a l s e ;

}

 

 

//   录制

_r ec o r dC o nt r o l .s t ar t Re c o r d() ;

_r ec o r di ng = t r u e ;

}

c a t c h ( E xc ep t io n e ){ Vid eoRe c o r di ng Demo . err o rD ia l o g ( e. t oS t r i ng ()) ;

}

}

 


 

 

p r iva t e vo i d s t o p Re c o r d( ) {

t r y {

_r ec o r dC o nt r o l .s t o pRe c o r d() ;

_r ec o r di ng = fa l s e ;

}

c a t c h ( E xc ep t io n e ){

Vid eoRe c o r di ng Demo . err o rD ia l o g ( " Re c o r dC o nt r o l#s t o pRec o r d( ) t hr ew " + e.t oS t r in g ()) ;

}

}

 

 

p r iva t e vo i d c omm itRe c o r di ng ( ){

t r y {

_r ec o r dC o nt r o l .c omm it() ;

_pendi ng C omm it = fa l s e ;

_c omm i tt ed = t r u e ;

_r ec o r di ng = fa l s e ;

 

//   视频数

b yt e [ ] d at a = _ou t S t r eam .t o Byt eArr ay() ;

 

//   件的形 保存视频

F il eC o nn ec t io n f c o nn = (F il eC o nn ec t io n) C o nn ec t o r .o p en ( _ videoF il e );

i f (f c o nn .exis t s ()) {

f c o nn .d elet e( ) ;

}

 

 

f c o nn .c r eat e( ) ;

Ou t pu t S t r eam o s = f c o nn .o penO ut pu t S t r eam () ;

os .w r ite( da t a) ; os .f lus h() ; os .c los e( ) ; f c o nn .c los e( ) ;

Di alo g .a le r t ( " C omm itt ed" );

}

c a t c h ( E xc ep t io n e ){

Vid eoRe c o r di ng Demo . err o rD ia l o g ( " Re c o r dC o nt r o l#c omm it( ) t hr ew " + e.t oS t r in g ()) ;

}

}

}

 

 

 

 

 

 


  V i d e o R e c o r d i n g S et u p S cr e e n. j a v a

 

 

 

pa c kage c om .r im .s am pl es. devi c e.video r e c o r di ng demo ;

 

 

im p o r t ne t .r im .d ev ic e.ap i. ui .*;

im p o r t ne t .r im .d ev ic e.ap i. ui .c o nt ai ner .* ;

im p o r t ne t .r im .d ev ic e.ap i. ui .c om po nent. *;

 

 

/**

* A s c r ee n t ha t al lo w s a us er t o c hoos e t he enc o di ng us ed t o r ec o r d

* video s and t h e f il e s ys t em t o r ec o r d t o .

*/

p u bli c fi n a l c l a s s Vid eoRec o r di n g S et up S c r ee n exte n d s M ai nS c r ee n i m pl e m e n t s F iel dC ha ng e L is t ener{

p r iva t e s t a t i c S t r in g F IL E _S Y ST E M _U RI _H EA DE R = " f il e: ///" ;

 

 

p r iva t e Ob j e c t C ho ic eFi eld _e n c o di ng s ; p r iva t e Ob j e c t C ho ic eFi eld _f il eSys t ems ; p r i va t e But t o nF iel d _lau n c hRe c o r der ;

 

 

p ub l i c Vid eoRe c o r di ng S et up S c r ee n( S t r in g [ ] enc o di n g s ) {

s e t T itle( " S et up s c r ee n " );

 

 

_e n c o di ng s = n e w Ob j ec t C ho ic eFi eld( " E nc o di ng : " , en c o di ng s , 0 ) ;

add( _e n c o di ng s );

 

 

_f il eSys t ems = n e w Ob j ec t C ho ic eFi eld ( " F il e S ys t em" , d ir , 0 ) ;

add( _f il eSys t e m s );

 

 

_lau n c hRe c o r der = n e w Bu tt o nF iel d( " S t ar t r ec o r di ng " ,

Butt o nF iel d.C ON SU M E _C L IC K | F iel d.F IE L D_ RIG H T );

_lau n c hRe c o r der .s et C ha ng e L is t en er ( t hi s );

add( _lau n c hRe c o r der ) ;

}

 

 

p u bli c s t a t i c fi na l S t r in g [ ] d ir   = { " s t o r e/ " , " S DC ar d/" };

 

 

p u bli c s t a t i c fi na l S t r in g SD _CA RD_P AT H = " S DC ar d/Bl a c kBer r y/v id eos /mm ap i _r im let .3 G P " ; p u bli c s t a t i c fi na l S t r in g M E M O RY _P AT H = " s t o r e/ho m e/us er /videos /mm ap i_r im let .3 GP " ; p u bli c S t r in g videoF il eP a t h = SD _CA RD_P AT H ;


 

 

p ub l i c vo i d f iel dC ha ng ed( F iel d f iel d, in t c o nt ext ) {

i f ( f iel d = = _lau n c hRe c o r der ) {

S t r in g s ele c t edE n c o di ng = (S t r in g )

_e nc o di ng s . g et C ho ic e( _ enc o di n g s .g et S el ec t edIn dex()) ; S t r in g s ele c t edF il eSys t em = (S t r in g )

_f il eSys t ems .g et C ho i c e( _f il eSys t ems .g et S ele c t edIn dex()) ;

S t r in g f il eP a t h = nu l l ; i f ( s ele c t edF il eSys t em. equa ls ( " s t o r e/ " )) { f il eP a t h = M E M O RY _P AT H ;

}

e l s e i f ( s elec t edF il eSys t em. equa ls ( " S DC ar d/" )) {

f il eP a t h = SD _CA RD_P AT H ;

}

 

 

U iA pp li c at io n.g e t U iA pp li c a t i o n () .p us hS c r e en(

n e w Vid eo Re c o r di ng S c r ee n( s ele c t edE nc o di n g , F IL E _SY S TE M _U RI_H EA DE R + f il eP at h)) ;

c los e( ) ;

}

}

 

 

p r o te c te d b o o l e a n o nS aveP r om p t ( ) {

// Su pp r ess t he s ave di al o g

r e t u r n t r u e ;

}

}

 

 

 

 


  V i d e o P l a y ba ckS c r e en. j a va

 

 

 

pa c kage c om .r im .s am pl es. devi c e.video r e c o r di ng demo ;

 

 

im p o r t j avax.m ic r o edi t io n.m edi a. P la y er ;

im p o r t j avax.m ic r o edi t io n.m edi a. P la y er L is t ener ;

im p o r t j avax.m ic r o edi t io n.m edi a. c o n t r o l. Vid eoC o nt r o l;

im p o r t j avax.m ic r o edi t io n.m edi a. c o n t r o l. Vo lum eC o nt r o l;

 

 

im p o r t j ava.io .I OE xc ep t io n;

im p o r t j ava.io .I np ut S t r eam ;

im p o r t j avax.m ic r o edi t io n. io .C o nn ec t o r ;

im p o r t j avax.m ic r o edi t io n. io .f il e.F il eC o nn ec t io n;

 

 

im p o r t ne t .r im .d ev ic e.ap i. ui .F iel d;

im p o r t ne t .r im .d ev ic e.ap i. ui .U iA pp li c at io n;

im p o r t ne t .r im .d ev ic e.ap i. ui .c om po nent. Di alo g ; im p o r t ne t .r im .d ev ic e.ap i. ui .c om po nent. L ab elF iel d ; im p o r t ne t .r im .d ev ic e.ap i. ui .c o nt ai ner . M ai nS c r ee n ;

 

 

p u bli c c l a s s Vid eoPla yba c kS c r e en exte n d s M ai nS c r ee n{

 

 

p r iva t e P la ye r _ video P la y er ;

p r iva t e Vid eoC o nt r o l _v id eoC o nt r o l ;

 

 

p ub l i c Vid eoPla yba c kS c r e en( In pu t S t r eam in pu t S t r ea m ) {

 

 

i f ( in pu t S t r eam = = n ull ) {

t h r o w n e w N ul lPoi nt er E xc ept io n( "' in pu t S t r eam ' c an no t b e nu ll " );

}

 

 


t r y {


 

_v id eoPla ye r = j av ax.m ic r o edi t io n.m edi a. M an a g er . c reat e P la y er ( in pu t S t r eam ,

" video /s bv " );


in itS c r ee n() ;

}

c a t c h ( E xc ept io n e ) {

Di alo g . a le rt ( " E xc ept io n w hi le in i t ia li z in g t he pl a ybac k vid eo pl ayer /n/n" + e) ;

}

}

 

 

 


 

 

/**

*   视频 放屏幕 按指定 径装载

*/

p ub l i c Vid eoPla yba c kS c r e en( S t r in g f il e) {

b o ol e a n no t E m pt y ;

 

//   检测给 路径是 有媒体

t r y {

F il eC o nn ec t io n f c o nn = (F il eC o nn ec t io n) C o nn ec t o r . o p en (f il e) ;

no t E m pt y = f c o nn .exis t s ( ) && f c o nn .f il eSi z e( ) > 0 ;

f c o nn .c los e( ) ;

}

c a t c h ( IO E xc e pt io n e ){

Di alo g .a le r t ( " E xc ep t io n w hi le ac c ess in g t h e video f il esi z e: /n/n" + e) ;

no t E m pt y = fa l s e ;

}

 

//   如有媒 文件并 内容, 始化界 播放

i f ( no t E m pt y )

{


t r y

{

 

 

 

 

 

}


 

 

 

//   创建   Vid eo P la ye r

_ video P la y er = j a vax.m ic r o edi t io n.m e di a. M an ag er . c rea t eP l a y er (f il e) ;

in itS c r ee n() ;


c a t c h ( E xc ept io n e )

{


 

 

}

}

e l s e

{


Di alo g . a le rt ( " E xc ept io n w hi le in i t ia li z in g t he pl ayb ac k video player /n/n " + e) ;


add( n e w L ab elF iel d( " T he v id eo f il e you ar e t r yin g t o pl a y is emp t y " ));

}

}

 

 

 

 

 

 

 

 

 

 


 

 

 

p r i va t e v oi d in itS c r ee n( ) t h r o w s E x c ept io n{

_v id eoPla ye r .r eali z e( ) ;

 

//   注册媒 播放时 响应

_v id eoPla ye r .a dd P la ye r L is t ener( n e w P la y er L is t ener ( ) {

p ub l i c vo i d pl ay erU pd at e( P la y er pl ayer , S t r in g eve nt , Ob j e c t ev ent D at a) {

//   定义媒 文件播 完毕时 响应

i f ( ev ent == P la ye r L is t ener . EN D_O F _ M E DI A ) { U iA pp li c at io n.g e t U iA pp li c a t i o n () .i nvo keL a t er( n e w R un na bl e() {

p u bli c v o i d r un ( ) {

Di alo g .a l ert ( " F in is hed pl ayin g " );

c los e( ) ;


 

 

 

 

 

}

} );


}

} ) ;

}


 

 

//   获取   Vid eoC o nt r o l 得播放 频的   F iel d

_v id eoC o nt r o l = ( Vid eoC o nt r o l) _v id eoPla y er .g e t C o nt r o l( " Vid eoC o nt r o l" );

F iel d vFi eld = (F iel d) _v id eoC o nt r o l .i ni t Dis pl ay M o de( Vid eoC o nt r o l. U SE _G U I_P RI M IT IVE ,

" ne t .r im .d ev ic e.ap i. ui .F iel d " );

ad d( vFi eld ) ;

 

 

//   获取   Vo lum eC o nt r o l 指定声 大小

Vo lum eC o nt r o l vo l = ( Vo lum eC o nt r o l) _v id eoPl ayer .g et C o nt r o l( " Vo lum eC o nt r o l" );

vol .s e t L e ve l( 30 ) ;

}

 

 

 

 


 

 

 

/**

* @s e e n et .r im .d ev i c e.ap i. ui .F iel d#o nVis ib il ityC ha n g e( boo lean )

*/

p r o te c te d v o i d o nVis ib il ityC ha ng e( b o ol e a n vis ib le)

{

// If t h e s c r ee n bec o m es vis ib le an d t h e video p la ye r w as c r eat ed, t hen

// s t ar t t he pl ayba c k .

i f ( vis ib le && _ video P la y er ! = n ul l )

{


t r y

{

 

 

}


 

 

 

_ video P la y er .s t ar t () ;


c a t c h ( E xc ept io n e )

{

// If s t ar t in g t h e video f ai ls , t erm in at e t he pl ayba c k

Di alo g . a le rt ( " E xc ept io n w hi le s t ar t in g t he v id eo /n/n " + e) ;

c los e( ) ;

}

}

}

 

 

 

 

/**

* @s e e n et .r im .d ev i c e.ap i. ui .S c r ee n#o nC los e( )

*/

p ub l i c vo i d c los e( )

{

// C los e t he v id eo p la ye r if it w as c r eat ed

i f ( _v id eoPla ye r ! = n ul l )

{

_v id eo P la ye r .c los e( ) ;

}

s u p e r . c los e( ) ;

}

}

 

 


 

  V i d e o R e c o r d i n g D e m o. j a va

 

 

 

pa c kage c om .r im .s am pl es. devi c e.video r e c o r di ng demo ;

 

 

im p o r t j ava.u t il .V ec t o r ;

im p o r t ne t .r im .d ev ic e.ap i. ui .*;

im p o r t ne t .r im .d ev ic e.ap i. ui .c om po nent. *;

im p o r t ne t .r im .d ev ic e.ap i.s ys t em. Dis pl ay ;

 

 

/**

* T hi s app li c at io n d emo ns t r at es ho w t o c ap t ur e an d r e c o r d vid eo us in g t he

* JS R 13 5 Mu l ti M edi a A P I ( MM A P I) . Vid eo c an b e r ec o r ded fr o m t he c am er a t o

* eit her a f il e o r t o an o ut pu t s t r eam .     T hi s s am pl e als o     demo ns t r at es ho w

* t o pl ayba c k t he r ec o r ded vid eo us in g t h e M ul t i M edi a A P I.

*/

p u bli c c l a s s Vid eoRe c o r di ng Demo ext e n d s U iA pp li c at ion

{

 

 

/**

* Cr eat es a n ew Video Re c o r di ng Demo o b j e c t

*/

p ub l i c Vid eoRe c o r di ng Demo ( )

{

// C he c k if v id eo r e c o r di ng is ena bl ed o n t hi s de vic e

fi n a l S t r in g [ ] enc o di n g s = g e t Vid eo E n c od i ng s ();

i f ( enc o di ng s ! = n ul l & & enc o di n g s . len g t h > 0 )

{


 

 

}

e l s e

{


pus hS c r ee n( n e w Vid eoRe c o r di ng S et up S c r ee n( enc o di n g s )) ;

 

 

 

 

 

U iA pp li c at io n.g e t A p p lic a t i o n () .i nvo ke L at er ( n e w Runn ab le( )

{


p u bli c v o i d r un ( )

{


 

 

 

}

} ) ;

}

}


Di alo g .a l ert ( " T hi s dev i c e is no t c ap ab le o f r ec o r di ng video " ) ; S ys t em. exi t ( 0 ) ;


 

 

 


 

 

p ub l i c s t a t i c v o i d er r o r Di alo g ( fi n a l S t r in g mess ag e) {

U iA pp li c at io n. g et U iAp p lic a t i o n () .i nvo keL at er( n e w Runn ab le( ) {

p ub l i c vo i d r un ( ) { Di alo g . a le rt ( m ess a g e) ;

}

} ) ;

}

 

 

p ub l i c s t a t i c v o i d m ai n( S t r in g [ ] ar g s ){

n e w Vid eo Re c o r di ng Demo () .ent er E ve nt Dis pa t c her() ;

}

 

 

p ub l i c s t a t i c S t r in g[ ] g e t Vid eoE nc o di n g s ( ) {

//   获取黑 手机设 支持的 频格 / 编码

S t r in g enc o di n g sS t r ing = S ys t em. g etP r op er t y ( " v id eo. enc o di ng s " );

 

//   如果没 支持的 频编码 返回空

i f ( enc o di ng s S t r in g == n u l l ) {

r et u r n n u ll ;

}

 

//   解析出 频规格

Ve c t o r en c o di ng s = n e w Vec t o r() ;

i n t s t ar t = 0 ;

i n t s pa c e = en c o di ng sS t r in g .i nd e xO f ( ' ' );

w hil e ( s pa c e ! = - 1 )

{

enc o di n g s .a dd E lem ent ( en c o di ng sS t r in g .s u bs t r in g ( s t ar t , s pa c e) ) ;

s t ar t = s pa c e + 1 ;

s pa c e = enc o di n g sS t r in g .i nd exOf ( ' ' , s t ar t ) ;

}

en c o di ng s .a dd E lem en t ( enc o di ng s S t r in g .s ubs t r in g ( s t ar t , enc o di n g sS t r in g .l en gt h())) ;

 

 

S t r in g[ ] enc o di n g Arr ay = n e w S t r in g [ enc o di n g s . s iz e( ) ] ;

en c o di ng s .c o p yInto ( enc o di n g Arr ay) ;

r e t u r n en c o di ng Arr ay;

}

}

 

 

 

 

 

 

 

 

 

 

 
 

 

 

BlackBerry SDK下载

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
黑莓JAD打包是指将应用程序打包成JAD格式,以供黑莓手机用户进行下载安装。以下是黑莓JAD打包下载的步骤: 1. 准备原始应用程序:首先需要有一个已经开发完善的黑莓应用程序,并确保它能在黑莓设备上运行。 2. 创建JAD文件:打开Java Development Environment (JDE) 或 BlackBerry Java Plug-in for Eclipse,并在此工具中创建一个新的BlackBerry项目。在项目中,选择“创建JAD文件”选项并填写应用程序的相关信息,例如应用程序名称、版本号、作者等。 3. 填写应用程序信息:在JAD文件中,您还可以填写其他应用程序信息,比如图标、描述、权限等。确保填写的信息准确和完整。 4. 打包应用程序:根据您的JAD文件,使用JDE或BlackBerry Java Plug-in for Eclipse将应用程序打包成COD文件格式。COD文件包含了应用程序的实际代码和资源。 5. 生成JAD和COD文件:在打包过程完成后,您将会得到一个COD文件和相应的JAD文件。这两个文件应该位于同一目录中。 6. 上传到服务器:将JAD和COD文件上传至可信任的服务器,以供用户下载。确保服务器可以支持JAD和COD文件的托管。 7. 提供下载链接:将JAD文件的下载链接提供给用户,他们可以通过点击链接来下载和安装您打包的应用程序。 总结起来,黑莓JAD打包下载是将已开发的黑莓应用程序打包为JAD格式,然后将打包后的JAD文件上传至服务器提供下载。用户可以通过下载链接获取JAD文件,并根据JAD文件进行应用程序的安装。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值