Tôi đã sao chép mã từ the answer here và tôi vẫn nhận được lỗi RuntimeException: setParameters lỗi trên nexus one. Tệp kê khai của tôi có quyền đối với máy ảnh và quyền wake_lock. Điều này hoạt động trên giả lập, và trên droid tôi không nhận được lỗi nhưng nó có một vấn đề xoay.RuntimeException trên Camera.setParameters() trên nexus one
Trả lời
Bạn rất có thể đang yêu cầu kích thước xem trước không hợp lệ. Nếu bạn kiểm tra kết quả của adb logcat
có thể bạn sẽ thấy một cái gì đó như thế này:
E/QualcommCameraHardware(22732): Invalid preview size requested: 480x724
Giải pháp là để yêu cầu kích thước xem trước gần nhất có sẵn cho một trong những bạn muốn; bạn có thể nhận danh sách các kích thước xem trước có sẵn bằng cách gọi getSupportedPreviewSizes
trong đối tượng Camera.Parameters được trả lại bởi Camera.getParameters.
tôi sửa chữa điều này bằng cách làm những gì La Mã cho biết, với các mã:
Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
Camera.Size cs = sizes.get(0);
parameters.setPreviewSize(cs.width, cs.height);
camera.setParameters(parameters);
Đối với những gì nó có giá trị, nguồn gốc của vấn đề của tôi kết thúc lên được rằng tôi đã cố gắng để gọi parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
mà không xác minh rằng chế độ flash được hỗ trợ bằng cách kiểm tra xem parameters.getFlashMode() != null
.
Có nhiều nguyên nhân gây ra ngoại lệ kém tài liệu này, vì vậy hãy kiểm tra tất cả các thông số của bạn và không chỉ rằng bạn đang sử dụng supportedPreviewSize
.
Điều này đã giúp tôi. :) cảm ơn bạn đã chia sẻ –
nếu (! getBaseContext(). getPackageManager(). hasSystemFeature ( PackageManager.FEATURE_CAMERA_FLASH)) { // Đèn flash máy ảnh không khả dụng trên thiết bị } –
Không có giải pháp nào ở trên giải quyết vấn đề này cho tôi. Thêm mã này trước khi thiết lập các tham số đã làm.
// stop preview before making changes
try {
mCamera.stopPreview();
} catch (Exception e){
// ignore: tried to stop a non-existent preview
}
//now set your parameters
Một số dự án máy ảnh mã nguồn mở như opencamera luôn luôn sử dụng try-catch
gọi Camera.setParameters:
private void setCameraParameters(Camera.Parameters parameters) {
if(MyDebug.LOG)
Log.d(TAG, "setCameraParameters");
try {
camera.setParameters(parameters);
if(MyDebug.LOG)
Log.d(TAG, "done");
} catch (RuntimeException e) {
// just in case something has gone wrong
if(MyDebug.LOG)
Log.d(TAG, "failed to set parameters");
e.printStackTrace();
count_camera_parameters_exception++;
}
}
ngoài, luôn luôn mới nhất từ getParameters
trước khi bạn gọi setParameters
như thế này:
void setRotation(int rotation) {
Camera.Parameters parameters = this.getParameters();
parameters.setRotation(rotation);
setCameraParameters(parameters);
}
giải pháp từ Sam là chính xác nhưng hình ảnh đầu ra vẫn được thu nhỏ một chút trên một số thiết bị máy tính bảng. Một trong những phương pháp hay nhất mà tôi tìm thấy trên Internet, chúng tôi nên đặt trong Máy chủ lưu trữ để các thuộc tính sẽ được sử dụng lại mỗi lần máy ảnh được tiếp tục. Đây là phương pháp được triển khai trong CameraHost:
@Override
public Parameters adjustPreviewParameters(Parameters parameters) {
List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
Camera.Size cs = sizes.get(0);
parameters.setPreviewSize(cs.width, cs.height);
return super.adjustPreviewParameters(parameters);
}
Đối với tôi điều này sẽ xảy ra sau khi chụp ảnh và xem trước sẽ đóng băng, cho đến khi tôi cập nhật cuộc gọi cho các tham số như sau. Nó luôn luôn quan trọng với lỗi này để đảm bảo bạn kiểm tra tất cả các thông số mà máy ảnh được yêu cầu đặt để đảm bảo rằng mọi thông số bạn yêu cầu máy ảnh tự thiết lập là có thể cho máy ảnh.
Camera.Parameters parameters = myCamera.getParameters();
Với kích thước xem trước:
if (myCamera.getParameters().getSupportedPreviewSizes() != null){
Camera.Size previewSize = getOptimalPreviewSize(myCamera.getParameters().getSupportedPreviewSizes(), width, height);;
parameters.setPreviewSize(previewSize.width, previewSize.height);
}
Với chế độ flash/Trọng tâm:
if(parameters.getSupportedFocusModes() != null && parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)){
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
}
if (parameters.getSupportedFlashModes() != null && parameters.getSupportedFlashModes().contains(Camera.Parameters.FLASH_MODE_AUTO)){
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);
}
myCamera.setParameters(parameters);
vv Tất cả những điều này được bọc trong một thử thoải mái {} catch() {} hoạt động tốt. Chúc may mắn.
Đây là Kích getOptimalPreview từ this great tutorial:
private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int width, int height)
{
// Source: http://stackoverflow.com/questions/7942378/android-camera-will-not-work-startpreview-fails
Camera.Size optimalSize = null;
final double ASPECT_TOLERANCE = 0.1;
double targetRatio = (double) height/width;
// Try to find a size match which suits the whole screen minus the menu on the left.
for (Camera.Size size : sizes){
if (size.height != width) continue;
double ratio = (double) size.width/size.height;
if (ratio <= targetRatio + ASPECT_TOLERANCE && ratio >= targetRatio - ASPECT_TOLERANCE){
optimalSize = size;
}
}
// If we cannot find the one that matches the aspect ratio, ignore the requirement.
if (optimalSize == null) {
// TODO : Backup in case we don't get a size.
}
return optimalSize;
}
- 1. Đèn LED không hoạt động trên Samsung Galaxy Nexus
- 2. Nexus One/Android "CPU có thể được cố định" lỗi
- 3. Giao diện Android Nexus One với Arduino + BlueSmirf
- 4. Eclipse không nhận dạng được thiết bị Nexus One
- 5. retuns trên ICS và Samsung Nexus trên DROP TABLE
- 6. Kết cấu màu đen OpenGL ES trên Nexus S
- 7. camera.setParameters không thành công trong android
- 8. NHibernate One-To-One
- 9. Nexus One - Bản phát hành Android 2.1, WHERE là SDK dành cho 2.1 ở đâu?
- 10. RuntimeException sử dụng Camera.open()
- 11. Đọc và viết Mifare Classic 1K RFID trên Nexus-S
- 12. Android. Gỡ lỗi trên thiết bị thực (Nexus 7)
- 13. Kích thước bánh mì nướng trên Galaxy Nexus
- 14. mediacontroller không hoạt động trên tab nexus 7
- 15. Không thể truy cập thư mục dữ liệu trong File Explorer của DDMS bằng Nexus One!
- 16. Android Nexus One - Tôi có thể tiết kiệm năng lượng bằng bảng phối màu không?
- 17. one-to-one fluent nhibernate?
- 18. Quan hệ One-to-One JPA Hibernate
- 19. Sử dụng đúng cách RuntimeException?
- 20. Cần tạo một RunTimeException mới cho EmptyStacks
- 21. NHibernate Nhiều-To-One trên Subclass Tham gia với Bộ lọc
- 22. EF Mã thác đầu tiên xóa trên ngoại chìa khóa one-to-many
- 23. Entity Framework Mã Đầu One to One Mối quan hệ
- 24. Mối quan hệ ONE-TO-ONE của Symfony
- 25. Android 4.2 trên Nexus 7: canvas.drawText() không hoạt động chính xác
- 26. Đèn pin LED trên Galaxy Nexus có thể điều khiển được bằng API nào?
- 27. Mục đích của máy ảnh cho ACTION_IMAGE_CAPTURE không xuất hiện trên Samsung Galaxy Nexus (4.0.2)
- 28. Sự kiện TYPE_MAGNETIC_FIELD không kích hoạt trên Galaxy Nexus ICS 4.0.2
- 29. Android: Lề trái/phải không mong muốn trên Nexus 10 ở chế độ ngang
- 30. Không có hình nền nào được hiển thị trên Galaxy Nexus (CHỈ)?
Bạn là đúng, ngoại trừ việc nó đã cố gắng để thiết lập nó để 320x480 và 480x320 sẽ làm việc. Điều này đưa tôi đến câu hỏi tiếp theo của tôi, tại sao phương thức SurfaceHolder.Callback.surfaceChanged() được gọi với độ phân giải thấp như vậy thậm chí không khớp với tỷ lệ khung hình của thiết bị? –
@Erik B - Tôi nhận thấy đây là phản hồi muộn cho nhận xét này nhưng có thể do ứng dụng của bạn ở chế độ tương thích và hệ thống đang xử lý pixel trong ứng dụng của bạn là 0,66x độ phân giải thiết bị thực tế. Vì vậy, 480x800 sẽ được hiển thị cho ứng dụng của bạn dưới dạng 320x533, có thể cạo một vài pixel theo chiều ngang hoặc chiều dọc cho thanh trạng thái trừ khi hoạt động của bạn ở chế độ toàn màn hình. –
Bạn làm gì trước phiên bản API 5? (Hãy nói rằng tôi muốn tương thích với android 1.5) – uvgroovy