void android.view.SurfaceHolder.setType(int type)
public abstract void setType(int type)从:API Level 1
不推荐使用此方法.这被忽略,在需要时自动设置该值.
设置曲面的类型.
http://developer.android.com/reference/android/view/SurfaceHolder.html
它说它是自动设置但是没有它我的视频不播放.这里发生了什么?有什么东西可以取代它吗?我有时间在Android上正确播放视频.
我从LogCat收到这些错误:
10-30 00:31:51.494: D/CameraHal(1205): CameraHal setOverlay/1/00000000/00000000
10-30 00:31:51.494: E/CameraHal(1205): Trying to set overlay, but overlay is null!, line:3472
10-30 00:31:51.494: W/CameraService(1205): Overlay create failed - retrying
...
10-30 00:31:52.526: E/CameraService(1205): Overlay Creation Failed!
...
10-30 00:31:52.588: E/AndroidRuntime(5040): FATAL EXCEPTION: main
10-30 00:31:52.588: E/AndroidRuntime(5040): java.lang.RuntimeException: startPreview failed
10-30 00:31:52.588: E/AndroidRuntime(5040): at android.hardware.Camera.startPreview(Native Method)
10-30 00:31:52.588: E/AndroidRuntime(5040): at com.matthewmitchell.nightcam.CameraSurfaceView.surfaceCreated(CameraSurfaceView.java:47)
10-30 00:31:52.588: E/AndroidRuntime(5040): at android.view.SurfaceView.updateWindow(SurfaceView.java:544)
10-30 00:31:52.588: E/AndroidRuntime(5040): at android.view.SurfaceView.dispatchDraw(SurfaceView.java:341)
10-30 00:31:52.588: E/AndroidRuntime(5040): at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
10-30 00:31:52.588: E/AndroidRuntime(5040): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
10-30 00:31:52.588: E/AndroidRuntime(5040): …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用媒体播放器在活动中播放网址:
mediaPlayer = MediaPlayer.create(getApplicationContext(),
Uri.parse("http://www.pocketjourney.com/downloads/pj/video/famous.3gp"),
holder);
Run Code Online (Sandbox Code Playgroud)
它工作正常.我使用相同的代码将其设置为in @onSurfaceCreated
中的动态壁纸WallpaperService
,它会给我以下错误日志
D/MediaPlayer( 4128): create failed: D/MediaPlayer( 4128):
java.io.IOException: setDataSource failed.: status=0x80000000
D/MediaPlayer( 4128): at
android.media.MediaPlayer._setDataSource(Native Method) D/MediaPlayer(
4128): at
android.media.MediaPlayer.setDataSource(MediaPlayer.java:844)D/MediaPlayer( 4128): at
android.media.MediaPlayer.setDataSource(MediaPlayer.java:806)......
Run Code Online (Sandbox Code Playgroud)
如果我使用本地视频uri设置动态壁纸..工作正常.
这里有什么想法/建议吗?
我想在SurfaceView上打开相机硬件.在布局中,我创建了一个SurfaceView,然后打开相机,如下面的代码所示.当我运行代码时,CameraAvailableCB中的toast出现并显示"onCameraAvailable",但SurfaceView上没有任何内容.
如何在SurfaceView上显示相机显示?
码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.mBtnCapture = (Button) findViewById(R.id.actMain_btn_capture);
this.mSurfaceView = (SurfaceView) findViewById(R.id.actMain_surfaceView);
this.mSurfaceHolder = this.mSurfaceView.getHolder();
this.mSurfaceHolder.addCallback(this);
this.mCameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);
try {
cameraIDsList = this.mCameraManager.getCameraIdList();
for (String id : cameraIDsList) {
Log.v(TAG, "CameraID: " + id);
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
cameraStateCB = new CameraDevice.StateCallback() {
@Override
public void onOpened(CameraDevice camera) {
Toast.makeText(getApplicationContext(), "onOpened", Toast.LENGTH_SHORT).show();
//requesting permission
int permissionCheck = ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA);
if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)) …
Run Code Online (Sandbox Code Playgroud) 每当我运行cam_thread时,我都会收到错误"app pass NULL surface".这个代码据说可以在HTC Incredible 1上运行.我已经稍微重新配置它以在机器人x上运行.但是我仍然遇到这个错误.
public class Android_Activity extends Activity
{
Main_thread simulator;
ToggleButton togglebutton;
EditText ip_text;
SensorManager sm = null;
SurfaceView view;
Sensors_thread the_sensors=null;
String IP_address;
Android_Activity the_app;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
view = new SurfaceView(this);
sm = (SensorManager) getSystemService(SENSOR_SERVICE);
ip_text = (EditText) findViewById(R.id.IP_edit_txt);
togglebutton = (ToggleButton) findViewById(R.id.CameraButton);
togglebutton.setOnClickListener(new btn_listener());
the_app = this;
}
@Override
protected void onResume()
{
super.onResume();
}
protected void onStop()
{
super.onStop();
simulator.stop_simu();
this.finish();
}
private class btn_listener implements OnClickListener …
Run Code Online (Sandbox Code Playgroud) 我正在用Android媒体播放器对象构建视频播放器.我能够听到音频,但视频没有出现在surfaceView上.这是我的代码
public class PlayerActivity extends Activity implements SurfaceHolder.Callback {
String path;
private MediaPlayer mp;
private SurfaceView mPreview;
private SurfaceHolder holder;
boolean pausing = false;
public static String filepath;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player);
getWindow().setFormat(PixelFormat.UNKNOWN);
mPreview = (SurfaceView)findViewById(R.id.surfaceView);
holder = mPreview.getHolder();
holder.setFixedSize(176, 144);
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mp = new MediaPlayer();
mp.setDisplay(holder);
try {
Intent intent = getIntent();
Uri fileuri = intent.getData();
filepath=fileuri.getPath();
} catch(Exception e) {}
try {
mp.setDataSource(filepath);
mp.prepare();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException …
Run Code Online (Sandbox Code Playgroud) public void render(){
Canvas canvas = null;
try{
canvas = this._surfaceHolder.lockCanvas(null);
synchronized (this._surfaceHolder) {
this.onDraw(canvas);
}
}catch(Exception e){ Log.w("Surface holder ", e.toString());}
finally{
if(canvas != null){
this._surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
protected void onDraw(Canvas canvas) {
this.renderBackGround(canvas);
for (Renderable renderable : this._fishes) {
renderable.render(canvas);
}
};
Run Code Online (Sandbox Code Playgroud)
06-07 19:49:09.143:E/SurfaceTextureClient(13629):queueBuffer:错误排队缓冲区到SurfaceTexture,-19
06-07 19:49:09.143:E/SurfaceTextureClient(13629):queueBuffer(handle = 0x1c1b30)失败(没有这样的设备)06-07 19:49:09.143:W/dalvikvm(13629):threadid = 11:线程退出with uncaught exception(group = 0x40c671f8)06-07 19:49:09.143:E/AndroidRuntime(13629):FATAL EXCEPTION:Thread-692
06-07 19:49:09.143:E/AndroidRuntime(13629):java.lang.IllegalArgumentException
06-07 19:49:09.143:E/AndroidRuntime(13629):在android.view.Surface.unlockCanvasAndPost(Native Method)
06-07 19:49:09.143:E/AndroidRuntime(13629):at com.android.internal.view.BaseSurfaceHolder.unlockCanvasAndPost(BaseSurfaceHolder.java:215)
提前致谢
我知道这是一个常见问题,但是这个堆栈跟踪显示其他错误.你可以看到即使setDisplay(holder)
被称为内部surfaceCreated
仍然会抛出IllegalArgumentException
.这也不是一个罕见的例外,昨天在~3,000,000个剪辑视图中发生了~125,000次.我可以向你保证,mCurrentPlayer
也可以正确初始化.
surfaceCreated:
@Override
public void surfaceCreated(SurfaceHolder holder) {
mIsSurfaceCreated = true;
mCurrentPlayer.setDisplay(holder);
}
Run Code Online (Sandbox Code Playgroud)
surfaceDestroy:
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mIsSurfaceCreated = false;
// Could be called after player was released in onDestroy.
if (mCurrentPlayer != null) {
mCurrentPlayer.setDisplay(null);
}
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
java.lang.IllegalArgumentException: The surface has been released
at android.media.MediaPlayer._setVideoSurface(Native Method)
at android.media.MediaPlayer.setDisplay(MediaPlayer.java:660)
at com.xxx.xxx.view.VideoPlayerView.surfaceCreated(VideoPlayerView.java:464)
at android.view.SurfaceView.updateWindow(SurfaceView.java:543)
at android.view.SurfaceView.access$000(SurfaceView.java:81)
at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:169)
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:590)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1644)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2505)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:154)
at …
Run Code Online (Sandbox Code Playgroud) 我使用的是SurfaceView
具有SurfaceHolder
与在我的测试应用程序相机预览开始.
public class TextLocatorActivity extends Activity {
private Preview pvw;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
pvw = new Preview(this);
setContentView(pvw);
}
Run Code Online (Sandbox Code Playgroud)
我想使用CameraPreview(随SDK版本7的SDK Samples一起提供).点击UI即可拍照.这是Preview
班级:
public class Preview extends SurfaceView implements OnClickListener, SurfaceHolder.Callback {
SurfaceHolder holder;
Camera cam;
final static String TAG = "TextLocator:Preview";
Preview(Context context) {
super(context);
holder = getHolder();
holder.addCallback(this);
this.setOnClickListener(this);
// seems to be required (although the docs state, this enum is deprecated, as the type will be …
Run Code Online (Sandbox Code Playgroud) 我正在为android构建一个paint应用程序.扩展随SDK提供的FingerPaint应用程序示例.但是,与FingerPaint不同,我使用SurfaceView和单独的渲染线程来绘制表面.所有这些都非常标准和直接.运作良好.但是,我希望在绘画表面上给出白色背景,这就像在白纸上画画一样.默认背景为黑色.我的表面视图的线程调用视图的onDraw()方法.
我在这里面临的问题是,如果我将背景颜色或背景资源设置为SurfaceView,则在下次渲染视图时,此背景将覆盖曲面的上一个绘图.我将用一个例子来解释这个:
假设我将背景设置为白色.现在,应用程序启动,我的SurfaceView具有白色.好的,到目前为止还不错.现在,我用手指在这个表面上画了一条红色的线条.该线现在显示在白色表面上.好.现在,这应该是一个绘画应用程序,并假设我想画一辆车.那么,我用手指画出第二条红线.第二行画在屏幕上,但我之前绘制的第一行消失了.也就是说,因为我已经为SurfaceView设置了一些背景,所以再次绘制背景,从而覆盖绘制的第一行.现在屏幕仅显示绘制的第2行.
显然,我不希望这种情况发生.当我不尝试改变背景时(即,在默认的黑色背景上显示两条线,没有有效的背景),代码完美地工作.但是当我设置一些理想的背景时,就会发生这种情况.有没有办法以某种方式拥有静态背景,每次都不会绘制?我希望背景只绘制一次,所有后续绘图都应该在这个背景上进行.我不希望android运行时,每次绘制我的视图时绘制背景,从而覆盖之前渲染中该视图上的所有绘图.有办法解决这个问题吗?
我尝试过的事情是:
使用android:background在XML中设置SurfaceView的背景颜色.
做到这一点,使用风格的概念.(指定样式值并在布局文件中引用它).样式只将背景颜色定义为#FFFFFFFF(白色).
将样式2设置为SurfaceView的父视图(RelativeLayout).
将样式2设置为整个应用程序,作为主题,在我的清单文件中使用android:theme.
将SurfaceView的背景可绘制设置为纯白色图像.
从代码中调用我的SurfaceView的setBackgroundColor,this.setBackgroundColor(Color.WHITE).
谢谢.
android background background-color surfaceview surfaceholder
android ×10
surfaceholder ×10
surfaceview ×6
camera ×2
media-player ×2
background ×1
canvas ×1
java ×1
robot ×1