2010-08-24 33 views
5

Tôi có thiết lập bộ thu phát để thông báo bật lên được hiển thị cho người dùng sau mỗi lần nâng cấp ứng dụng của tôi hoặc nếu đây là lần đầu tiên gói được cài đặt. Tôi đã thử nghiệm trên Droid của tôi chạy Android 2.2 cả hai như là một cài đặt mới và sau khi nâng cấp ứng dụng của tôi, cũng như trong Emulator chạy 1,5 và 1,6, và tôi thấy tất cả mọi thứ chạy tốt.Lỗi phát sóng Android: Không tìm thấy lớp học ngoại lệ

Tuy nhiên, tôi nhận được một báo cáo lỗi từ một người dùng liệt kê các ngoại lệ sau đây:

java.lang.RuntimeException: Unable to instantiate receiver 
com.name.pkg.FirstRunBroadcastReceiver: java.lang.ClassNotFoundException: com.name.pkg.app_name.FirstRunBroadcastReceiver in loader dalvik.system.PathClassLoader[/data/app/com.name.pkg.app_name.apk] 
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2789) 
at android.app.ActivityThread.access$3200(ActivityThread.java:125) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2083) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:4627) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.ClassNotFoundException: com.name.pkg.app_name.FirstRunBroadcastReceiver in loader dalvik.system.PathClassLoader[/data/app/com.name.pkg.app_name.apk] 
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:573) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:532) 
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2780) 
... 10 more 

Ai đó có thể cho tôi biết lý do tại sao một số người sử dụng tôi đã nhận được ngoại lệ này?

Trong tập tin Manifest của tôi, tôi có những thứ thiết lập như thế này:

<receiver android:name=".FirstRunBroadcastReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.PACKAGE_REPLACE"/> 
     <data android:scheme="package" android:path="com.name.pkg.app_name"> 
    </intent-filter> 
</receiver> 

Các FirstRunBroadcastReceiver lớp được thiết lập như thế này:

package com.name.pkg.app_name; 

public class FirstRunBroadcastReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Contenxt context, Intent intent) 
    { 
     Uri uri = intent.getData(); 
     if(uri.toString().compareTo("package:com.name.pkg.app_name") == 0) 
     { 
      //set shared prefs data to determine if start-up message should be shown 
     } 
    } 
} 

Upon a lần đầu tiên cài đặt, giá trị mặc định cho chia sẻ prefs được thiết lập sao cho thông báo bật lên sẽ được hiển thị, nhưng tôi sẽ không nghĩ rằng sẽ có bất cứ điều gì để làm với ngoại lệ này.

Tôi đã thử nghiệm lại lần nữa và tôi không nhận được ngoại lệ. Cảm ơn vì bất kì sự giúp đỡ nào của bạn.

+0

Đây có phải là điều liên tục cho người dùng này không? Hay nó chỉ xảy ra một lần? – Falmarri

+0

Hi Falmarri, tiếc là tôi không có ý tưởng nếu đây là một ngoại lệ liên tục hay không. Tôi đã nhận được báo cáo thông qua Android Market. Ai đó gặp phải lỗi này đã không gửi cho tôi một email, điều đó thật tuyệt. Vì vậy, tôi chỉ không biết. Chỉ có một báo cáo lỗi cho điều này trong tài khoản Market của tôi, nhưng điều đó không nhất thiết có nghĩa là bất cứ điều gì. – Michael

+0

Bạn đã giải quyết vấn đề này chưa? - Đăng câu trả lời. – levi

Trả lời

0

Khai báo gói trong lớp học FirstRunBroadcastReceiver của bạn như sau?

package com.name.pkg.app_name; 

Theo ngăn xếp ngoại lệ của bạn, nó phải như vậy.

+0

Hi radek-k, vâng, tờ khai gói của tôi nằm trong FirstRunBroadcastReceiver. Đây là dòng đầu tiên trong tệp nguồn. Tôi sẽ cập nhật bài đăng gốc của mình và thêm bài đăng này. – Michael

+0

Câu hỏi của tôi là: là khai báo gói chính xác giống như tôi đã viết ở trên? – plugmind

+0

Chính xác như bạn đã viết? Nếu bạn đang nói về tên thật của ứng dụng, thì rõ ràng tên ứng dụng không được gọi là "app_name" và khác hơn thế, tôi đã chỉnh sửa bài đăng của mình để hiển thị chính xác mã nguồn nói. – Michael

3

từ tài liệu android vào "android: xuất khẩu" thuộc tính cho một người nhận:

hay không thu phát sóng có thể nhận tin nhắn từ các nguồn bên ngoài ứng dụng của nó - "true" nếu nó có thể, và "false" nếu không phải. Nếu "sai", các tin nhắn duy nhất mà người nhận phát sóng có thể nhận được là những tin nhắn được gửi bởi các thành phần của cùng ứng dụng hoặc ứng dụng có cùng ID người dùng. Giá trị mặc định tùy thuộc vào việc bộ thu phát có chứa bộ lọc ý định hay không. Sự vắng mặt của bất kỳ bộ lọc nào có nghĩa là nó chỉ có thể được gọi bởi các đối tượng Intent xác định tên lớp chính xác của nó. Điều này ngụ ý rằng người nhận chỉ dành cho việc sử dụng nội bộ ứng dụng (vì những người khác thường không biết tên lớp). Vì vậy, trong trường hợp này, giá trị mặc định là "false". Mặt khác, sự hiện diện của ít nhất một bộ lọc ngụ ý rằng bộ thu phát nhằm mục đích nhận được truyền phát bởi hệ thống hoặc các ứng dụng khác, do đó giá trị mặc định là "true"

Vì người nhận của bạn có ý định con mặc định giá trị cho android:exported là đúng. Chỉ cần nói rõ điều này và nó sẽ hoạt động tốt.

tức,

<receiver android:name=".FirstRunBroadcastReceiver" android:exported="true"> 
<intent-filter> 
    <action android:name="android.intent.action.PACKAGE_REPLACE"/> 
    <data android:scheme="package" android:path="com.name.pkg.app_name"> 
</intent-filter> 

0

Tôi là một newbie với sự phát triển Android và giải pháp của tôi là một đơn giản gây ra sự ngu dốt của tôi. Tôi đã đổi tên tệp phát sóng của mình và khi tôi cố gắng chạy ứng dụng, tôi đã nhận được lỗi classdefnotfound. Tôi đã kết thúc việc dọn dẹp và xây dựng lại dự án và lỗi đã bị xóa.

Các vấn đề liên quan