2013-07-15 35 views
12

ứng dụng của tôi là khá cơ bản và đơn giản, tôi chỉ cần mở camera (Không thậm chí hiển thị hình ảnh, tôi nhận xét mã)ứng dụng bị treo/đóng băng khi sử dụng camera.open() - Khởi động lại thiết bị cần thiết

Vì vậy, , về cơ bản, tôi có cái gì đó như:

@Override 
public void onResume() { 
    super.onResume(); 
    if (camera != null) { 
     //Just to be sure 
     camera.stopPreview(); 
     camera.setPreviewCallback(null); 
     camera.release(); 
     camera = null; 
    } 

    Log.e("DebugCam", "Before"); 
    camera = Camera.open(); 
    Log.e("DebugCam", "After"); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    if (camera != null) { 
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
    } 
} 

Nhưng logcat của tôi chỉ được hiển thị thông báo đầu tiên:

Before 

ứng dụng chỉ được treo, và tôi có để khởi động lại thiết bị để nó hoạt động trở lại !!!

Tôi thực sự không hiểu vấn đề ở đâu hoặc cách tôi có thể tránh được sự đóng băng thực sự gây phiền nhiễu.

Tôi thật sự không được làm thế nào tôi có thể gỡ lỗi này ...

Edit: Tôi đã thấy điều này trên theo dõi lỗi Android, có vẻ như tôi cần một workaround như các bản vá đã được phát hành vào tháng Sáu) https://code.google.com/p/android/issues/detail?id=1578

+0

Xem http://stackoverflow.com/questions/16842407/android-samsung-galaxy-s4-reboot-issue – ridoy

+0

Điện thoại không khởi động lại . Điện thoại không phải là Galaxy (Sony và ALcatel) –

+0

ngoài ứng dụng, máy ảnh của thiết bị có hoạt động như thế này khi bình thường bạn mở máy ảnh hoặc chụp ảnh không? – ridoy

Trả lời

0

Vấn đề có liên quan đến dữ liệu của bạn được cập nhật Rom được cài đặt vào điện thoại di động của bạn, không có cách nào để làm bất cứ điều gì trừ khi bạn cập nhật Rom của bạn trong điện thoại di động của bạn.

3

Trước hết tôi muốn tuyên bố rằng tôi không tìm kiếm phiếu bầu hay danh tiếng hay bất cứ điều gì cho điều này, nhưng muốn tóm tắt tất cả thông tin về vấn đề mà tôi tìm thấy, vì vậy xin đừng quá khắc nghiệt :-).

tôi đã thực hiện một số nghiên cứu và tôi tìm thấy một chủ đề thú vị và có lẽ không phải như vậy liên quan chặt chẽ về một vấn đề tương tự trong DroidForums:

Ở đó, họ phát hiện ra, rằng thẻ SD đã gây ra Freese (Tôi không chắc chắn nếu đó là trường hợp hiện nay, nhưng nó sẽ là tốt nếu ai đó có thể thử nó) và đây là đoạn trích từ đó:

máy ảnh và máy quay của tôi đã đóng băng lên như nhiều người dân khác và tôi đã thất vọng. .trong tay tôi, tôi có điện thoại "Like-New" hy vọng rằng sẽ giúp ... không may mắn ... nó là gì ... THẺ SDHC! định dạng đơn giản của thẻ và các vấn đề đã biến mất..để tự mình thử nghiệm này chuyển đến cài đặt chính của bạn và tháo thẻ sd rồi khởi động lại ứng dụng máy ảnh và xem nó có bị đóng băng không ... nếu nó không giống như tôi đã không sau đó bạn có câu trả lời của bạn ... không chính xác chắc chắn những gì trên thẻ SDHC của tôi gây ra điều này ... vẫn đang được điều tra, nhưng chắc chắn một cái gì đó ở đó ... tôi sẽ cập nhật khi tôi tìm ra chính xác những gì cho mọi người khác

Hy vọng điều này sẽ giúp và cảm ơn tất cả vì nhiều lời khuyên tôi đã sử dụng từ diễn đàn này ...

CẬP NHẬT !!!

Tôi chỉ gặp vấn đề tương tự một lần nữa với điện thoại Gingerbread mới và tôi đã thử một cái gì đó mới ... chỉ cần di chuyển một số ảnh và vidoes ra khỏi số điện thoại và sao lưu chúng vào PC ... ... không cần định dạng toàn bộ thẻ, chỉ cần cung cấp cho máy ảnh/ứng dụng máy quay một số không gian..as nếu 5.5GB không đủ, nhưng hey ai biết ... hiện tại video chỉ mất 1/2 giây để lưu và máy ảnh đang hoạt động tốt trở lại ... chỉ nghĩ rằng tôi sẽ cho tất cả các bạn biết ..

Nói chung, có vẻ như thẻ nhớ gây ra sự cố đôi khi (hoặc trong hầu hết các trường hợp), vì vậy nếu bạn định dạng thẻ bạn đang sử dụng hoặc thay thế bằng thẻ mới bạn có thể thấy nếu đó là vấn đề.

Hơn nữa, trên lỗi chính thức, được ghi lại here (như bạn đã đề cập): Rõ ràng trường hợp thử nghiệm giống với trường hợp bạn đã trình bày ở đây, vì ứng dụng sử dụng Camera.open() đang gặp sự cố về chính xác cùng một chỗ.

Trích từ đó:

Rõ ràng, Camera.open() chính nó bị treo mà không gây ra bất kỳ ngoại lệ, như vậy mà không có gì mà tôi có thể bẫy và hành động theo. Sau đó, tôi có thể cũng không sử dụng ứng dụng máy ảnh tích hợp vì nó chỉ hiển thị màn hình màu đen và một chút sau đó là một thông báo không phản hồi khi tôi thử để tương tác với nó. Vì đoạn mã ở trên là đã bị vô hiệu (khi khởi động chương trình), không có gì là tôi có thể phát hành : không có camera.release().

Thật tốt khi điều này đã được cố định trong phiên bản mới nhất và cách đây vài ngày đã có một bình luận (người cuối cùng, đó là từ ngày 15 Tháng Bảy năm 2013):

Cảm ơn bugfixe, nhưng là có một cách giải quyết khác cho thiết bị hơn cũ ngày 22 tháng 6 năm 2013, khi bản vá được phát hành (mà có nghĩa là sau khi 4.2.2 phát hành vào tháng 2 năm 2013 ...)

Hy vọng rằng chúng tôi sẽ được cập nhật trên thế này, vì vậy, chúng ta hãy cùng nghe tin tức ở đó r cũ hơn API.

Hơn nữa tôi thấy thread here (một lần nữa, nhắc đến một vấn đề thẻ SD; không có nhiều thông tin ở đó, nhưng dù sao):

Trích từ đó:

Và giải pháp được tìm thấy: Tôi đã xóa các hình thu nhỏ trên thư mục hình ảnh thẻ SD của tôi và khởi động lại điện thoại. Có vẻ như cửa sổ thu nhỏ nhỏ cho biết ảnh cuối cùng chịu trách nhiệm về vụ tai nạn ứng dụng , vì một số lý do mà ngón tay cái không thể tải và ứng dụng đã bị lỗi.

Sau đó, đã có this thread trên xda-Developers có tên "4.2 Android camera APK FIX!" (Không nhận được vui mừng, này là dành cho các thiết bị bắt nguồn từ chỉ :-():

hướng dẫn nhanh lấy từ chủ đề:

Máy ảnh apk: http://db.tt/xmpgkZIA

Thêm apk này vào hệ thống/sau khi cài đặt apk máy ảnh đầu tiên chỉ cho thủ công. http://db.tt/OZF6D8fL

Đây là các tệp lib đặt chúng trên giấy phép sửa lỗi hệ thống/lib rồi khởi động lại. http://db.tt/73lcCrcl http://db.tt/wQ7bfR8N

Đối với những người có thiết bị không được hỗ trợ, thay đổi dòng sau trong build.prop và khởi động lại:

ro.product.model = Galaxy Nexus ro.product.brand = google

Tiếp theo (chỉ đề cập đến nó cho công chúng rộng rãi), tôi tìm thấy điều này trong AndroidCentral, chỉ vì lợi ích của nó, nó lại là một "sửa chữa" cho các thiết bị bắt nguồn từ.

Trên sebertech trang web, tôi thấy chủ đề này liên quan đến một vấn đề camera với Galaxy S3 và nó TouchWix chủ yếu - LINK:

Đối với đơn vị Galaxy S3 được cản với vấn đề hiệu suất, rễ là bước đầu tiên để giải quyết những vấn đề đó. Nhưng bạn phải xem xét các rủi ro liên quan, mặc dù đã có các cách an toàn để nhổ tận gốc điện thoại. Nhưng trước khi bạn thực sự quyết định làm , tôi có một số điều tôi muốn bạn thử.

  1. Thu hồi các ứng dụng bạn vừa mới cài đặt, thử tắt chúng và xem có cải thiện hiệu suất của điện thoại hay không. Một số ứng dụng thực sự nặng có thể thậm chí đã gây ra hoặc đóng góp cho sự cố .
  2. Thử xóa bộ nhớ bằng cách đi tới Màn hình chính và giữ trên nút Màn hình chính. Danh sách các ứng dụng đang chạy hoặc được mở gần đây sẽ hiển thị ; bạn chỉ cần vuốt sang trái hoặc phải để đóng chúng lại. Tôi khá là chắc chắn bạn đã biết tác dụng của việc có quá nhiều ứng dụng đang chạy ở nền.

Giới hạn Galaxy S3 Processes

  1. Từ màn hình Home, nhấn nút Menu và chọn Settings.
  2. Cuộn xuống và nhấn vào Tùy chọn nhà phát triển.
  3. Tìm tùy chọn “Giới hạn quy trình nền” và nhấn vào nó.
  4. Hạn chế Galaxy S3 chạy khoảng 4 quy trình cùng một lúc hoặc thấp hơn.

Xóa dữ liệu cho TouchWiz

  1. Từ màn hình Home, chạm vào nút Menu.
  2. Chọn Cài đặt hệ thống, sau đó chọn Trình quản lý ứng dụng
  3. Cuộn xuống để tìm TW và nhấn vào Xóa dữ liệu.

Nếu không có gì khác hoạt động, có lẽ đã đến lúc root thiết bị của bạn và sử dụng ROM tùy chỉnh nhẹ hơn và nhanh hơn và loại bỏ giao diện TouchWiz.

Cuối cùng, để kết thúc câu trả lời looong này, tôi muốn nói rằng, mặc dù tôi thấy rất ít sửa chữa/cách giải quyết cho điều này, tôi thực sự hy vọng, rằng Offical Bug Fix (liên kết lại, để có điều này trích dẫn một lần nữa) sẽ có sẵn rộng rãi và không chỉ cho các phiên bản 4.xx của Android, thật đáng tiếc là chúng tôi không có phiên bản cũ hơn (giao dịch với sửa lỗi cho các API cũ hơn là gì?).

TL; DR

Cheers ;-)

+0

Chà, quá dài ... bạn chắc chắn rằng bạn tóm tắt điều này? Chúng tôi sẽ không downvote này, nhưng tôi nghĩ rằng đó chỉ là dư thừa – fedmich

1

thử điều này:

@Override 
public void onResume() { 
super.onResume(); 
if (camera != null) { 
    //Just to be sure 
    camera.stopPreview(); 
    camera.setPreviewCallback(null); 
    camera.release(); 
    camera = null; 
} 

Log.e("DebugCam", "Before"); 
try { 
    camera = Camera.open();// this is no safe way to open the camera 
}catch(Exception e) 
{ 
    e.printStackTrace();//get the exception on Logcat 
} 
Log.e("DebugCam", "After"); 
} 

trực tiếp từ DOCS

/** Một cách an toàn để có được một thể hiện của đối tượng ảnh . */

public static Camera getCameraInstance(){ 
Camera c = null; 
try { 
    c = Camera.open(); // attempt to get a Camera instance 
} 
catch (Exception e){ 
    // Camera is not available (in use or does not exist) 
} 
return c; // returns null if camera is unavailable 
} 

Nhìn này: http://developer.android.com/guide/topics/media/camera.html#custom-camera

+0

Không có ngoại lệ được ném ... Vẫn còn cùng một vấn đề –

+0

@waza_be Thay vì 'catch (Exception e)' try ' catch (Throwable throwable) ', có lẽ bạn có thể bắt một Throwable – Sadegh

1

tôi phải đối mặt với một vấn đề tương tự và điều này đã làm việc cho tôi:

Rõ ràng cuộc gọi này lại được làm tắc nghẽn bộ đệm với dữ liệu cho mỗi khung xem trước camera .

camera.setPreviewCallback(new PreviewCallback() { 
     public void onPreviewFrame(byte[] data, Camera arg1) { 
     //invalidate surfaceview 
     } 
}); 

Xóa cuộc gọi lại đã làm việc cho tôi. Hy vọng nó giúp. :)

+0

Bạn có ý nghĩa gì bởi" surfaceview không hợp lệ "tôi nên làm gì đó, hoặc không có mã nào thực sự làm mất hiệu lực? –

+0

Không làm gì trong cuộc gọi lại – SHANK

+0

Cùng một vấn đề, tôi đặt mã này trên onPause cũng như on onResume, trước khi mở máy ảnh .. Đồng thời đóng băng ... –

0

Nếu yêu cầu của bạn chỉ là để mở một máy ảnh, tôi sẽ sử dụng đoạn mã sau
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, actionCode);
cho rằng bạn cần final static int actioncode=100; này như lớp biến

0

Trong bạn loại bỏ SurfaceView của bạn từ frameLayout như:

@Override 
protected void onPause() { 
    super.onPause(); 
    if (camera != null) { 
     camera.stopPreview(); 
     camera.setPreviewCallback(null); 
     camera.release(); 
     camera = null; 

     preview.removeView(mPreview); //here preview is FrameLayout and mPreview is your camera SurfaceView. 
    } 
} 
Các vấn đề liên quan