Ошибка приемника Android-трансляции: исключение класса не найдено - PullRequest
5 голосов
/ 24 августа 2010

У меня настроен приемник Broadcast, поэтому всплывающее сообщение отображается для пользователя после каждого обновления моего приложения или при первой установке пакета. Я проверил это на своем Droid с Android 2.2 как в новой установке, так и после обновления моего приложения, а также в эмуляторе 1.5 и 1.6, и я вижу, что все работает нормально.

Однако я получил сообщение об ошибке от пользователя, в котором перечислено следующее исключение:

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

Может кто-нибудь сказать мне, почему один из моих пользователей получил это исключение?

В моем файле манифеста у меня есть такие настройки:

<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>

Класс FirstRunBroadcastReceiver настроен так:

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
        }
    }
}

При первоначальной установке значение по умолчанию для общих префов задается так, что всплывающее сообщение будет отображаться, но я не думаю, что это как-то связано с этим исключением.

Я снова проверил это и не получил исключения. Спасибо за любую помощь, вы можете предоставить.

Ответы [ 3 ]

4 голосов
/ 24 августа 2011

из документации Android по атрибуту "android: exported" для получателя:

Может ли широковещательный приемник принимать сообщения из источников за пределами своего приложения - "истина", если может, и "ложь", если нет. Если установлено значение «ложь», единственные сообщения, которые может принимать получатель широковещательной рассылки, - это сообщения, отправленные компонентами одного и того же приложения или приложений с одинаковым идентификатором пользователя. Значение по умолчанию зависит от того, содержит ли широковещательный приемник фильтры намерений. Отсутствие каких-либо фильтров означает, что он может быть вызван только объектами Intent, которые указывают его точное имя класса. Это подразумевает, что получатель предназначен только для внутреннего использования приложения (поскольку другие обычно не знают имя класса). Так что в этом случае значением по умолчанию является «ложь». С другой стороны, наличие хотя бы одного фильтра подразумевает, что приемник широковещания предназначен для приема намерений, транслируемых системой или другими приложениями, поэтому значением по умолчанию является «true»

Так как у получателя есть дочерние намерения, значение по умолчанию для android:exported равно true. Просто сформулируйте это явно, и оно должно нормально работать.

т

<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 голосов
/ 02 декабря 2014

Я новичок с разработкой для Android, и мое решение было простым, вызвавшим мою глупость. Я переименовал файл вещательного приемника, и при попытке запустить приложение я получил ошибку classdefnotfound. Я закончил очищать и перестраивать проект, и ошибка была удалена.

0 голосов
/ 24 августа 2010

Является ли объявление пакета в вашем классе FirstRunBroadcastReceiver следующим образом?

package com.name.pkg.app_name;

В соответствии со стеком исключений должно быть так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...