BroadcastReceiver: access to class not allowed

  • Antworten:5
Eve
  • Forum-Beiträge: 25

09.06.2013, 15:04:11 via Website

Hallo Zusammen,

ich habe bereits gegoogelt, aber nichts passendes gefunden...
Und ich glaube, dass bei mir eher ein grundsätzliches Verständnisproblem vorliegt. Ich bin ja ein aboluter Java-Neuling...

Jedenfalls bekomme ich beim Installieren meiner APP eine Exception: "access to class not allowed". Ich habe u.a. das hier in der Datei TestMain.java:


1public class TestMain extends Activity implements OnClickListener
2{
3 // ... Auszug...
4 private Button buttonShow;
5
6 @Override
7 protected void onCreate(Bundle savedInstanceState)
8 {
9 super.onCreate(savedInstanceState);
10 setContentView(R.layout.layout_test_main);
11 }
12
13 // usw.
14
15} // end of TestMain
16
17
18// jetzt kommt das mit dem BroadcastReceiver
19// Quelle: hier dieses Forum:
20final class TestUpdateReceiver extends BroadcastReceiver
21{
22 private String LOG_TAG = TestUpdateReceiver.class.getSimpleName();
23 private Uri uri = new Uri.Builder().scheme("package").encodedOpaquePart("com.example.test").build();
24
25 @Override
26 public void onReceive(Context _context, Intent _intent)
27 {
28 if (uri.equals(_intent.getData()))
29 {
30 Log.i(LOG_TAG, "TestUpdateReceiver called");
31 createTestTxt( _context,"test.txt");
32 }
33 else
34 Log.i(LOG_TAG, "else-Ast von TestUpdateReceiver!!! Hallo hier!!!!");
35
36 }
37
38 // Datei test.txt anlegen
39 public File createTestTxt(Context _context, String filename)
40 {
41 String msgtxt = "hallo";
42 // den restlichen Code habe ich nicht gepostet, weil ich glaube,
43 // dass ich gar nicht bis hierher komme...
44
45 }
46
47} // end of TestUpdateReceiver

Im Manifest steht u.a.

<receiver
android:name="com.example.test.TestUpdateReceiver"
android:label="@string/app_name"
android:enabled="true"
android:exported="false">
<intent-filter>
<action
android:name="android.intent.action.PACKAGE_CHANGED" />
<action
android:name="android.intent.action.PACKAGE_ADDED" />
<action
android:name="android.intent.action.PACKAGE_INSTALL" />
<action
android:name="android.intent.action.PACKAGE_REPLACED" />
<data
android:scheme="package"
android:path="com.example.test" />
</intent-filter>
</receiver>


Nachdem ich die (das?) apk installiert habe, bekommte ich im Logcat folgenden Output:
----------------------------------------------------
D/dalvikvm(20359): newInstance failed: Lcom/example/test/TestUpdateReceiver; not accessible to Landroid/app/ActivityThread;
D/AndroidRuntime(20359): Shutting down VM
W/dalvikvm(20359): threadid=1: thread exiting with uncaught exception (group=0x40018578)
D/dalvikvm( 1302): GC_EXPLICIT freed <1K, 49% free 2746K/5379K, external 408K/517K, paused 64ms
E/liblog ( 1466): failed to call dumpstate
E/AndroidRuntime(20359): FATAL EXCEPTION: main
E/AndroidRuntime(20359): java.lang.RuntimeException: Unable to instantiate receiver com.example.test.TestUpdateReceiver: java.lang.IllegalAccessException: access to class not allowed
E/AndroidRuntime(20359): at android.app.ActivityThread.handleReceiver(ActivityThread.java:1777)
E/AndroidRuntime(20359): at android.app.ActivityThread.access$2400(ActivityThread.java:117)
E/AndroidRuntime(20359): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:985)
E/AndroidRuntime(20359): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(20359): at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime(20359): at android.app.ActivityThread.main(ActivityThread.java:3687)
E/AndroidRuntime(20359): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(20359): at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime(20359): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
E/AndroidRuntime(20359): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
E/AndroidRuntime(20359): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(20359): Caused by: java.lang.IllegalAccessException: access to class not allowed
E/AndroidRuntime(20359): at java.lang.Class.newInstanceImpl(Native Method)
E/AndroidRuntime(20359): at java.lang.Class.newInstance(Class.java:1409)
E/AndroidRuntime(20359): at android.app.ActivityThread.handleReceiver(ActivityThread.java:1768)
E/AndroidRuntime(20359): ... 10 more
E/ ( 1466): Dumpstate > /data/log/dumpstate_app_error


-------------------------------------------
den log.i von oben sehe ich gar nicht (weder den if- noch den else-log)

Brauche ich denn sowas wie ein
TestUpdateReceiver tur = new TestUpdateReceiver() in meinem main?
und dann tur.createTestTxt()

Falls ja: wo müsste ich das dann einbauen? im onCreate meiner Main-Klasse?

Danke für eure Antworten,
VG,
Eve

Antworten
Eve
  • Forum-Beiträge: 25

09.06.2013, 20:03:19 via Website

Also ich habe diese Seite gefunden, und genauso gemacht wie da beshrieben:

...sorry... ich darf keinen Link veröffentlichen. Jedenfalls habe ich in Eclipse ein zweites Package parallel zu meinem Main-Package angelegt. Im neuen Package war ist jetzt mein Receiver.

Aber damit ging es immer noch nicht. Dann hab ich gefühlte 1000x probiert, geändert, korrigiert. Letztendlich hatte ich an einer Stelle Klein- statt Großbuchstaben im Code. Aber nur, weil der Compiler sagte, im Manifest sollte ich Kleinbuchstaben statt Großbuchstaben oder $ anstatt . verwenden.

Na, wie auch immer.

Jetzt bekomme ich im Log das hier (s.o.): "else-Ast von TestUpdateReceiver!!! Hallo hier!!!!"
d.h. mein uri equals nicht mit _intent.getData()
Warum auch immer...

Oje...

Ich will doch eigentlich nur, dass meine App eine Datei anlegt bei Installation. Kann doch nicht so schwierig sein...
:)

VG,
Eve

— geändert am 09.06.2013, 20:04:17

Antworten
Michele
  • Forum-Beiträge: 1.525

09.06.2013, 21:35:16 via Website

Hallo Eve.

Wie wäre es wenn du noch sagst was du überhaupt vor hast.
Damit man es besser versteht im Code.


LG

Antworten
impjor
  • Forum-Beiträge: 1.793

09.06.2013, 21:48:11 via App

Hat er doch schon :P
Du könntest die Datei aber auch anlegen, wenn der Benutzer die App das erste mal startet, oder?

Gruß

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Michele
  • Forum-Beiträge: 1.525

09.06.2013, 21:56:43 via Website

Nun habe ich es auch gesehen :grin:

Ja da würde ich das gleiche wie impjor nun sagen.



LG

Antworten
Eve
  • Forum-Beiträge: 25

11.06.2013, 19:46:45 via Website

impjor
Hat er doch schon :P
Du könntest die Datei aber auch anlegen, wenn der Benutzer die App das erste mal startet, oder?

Gruß

Er??? Wer er???? Meiner Er? Dann "sie" bitte :girl: :bashful:

Warum ich das nicht beim ersten Mal mache?
1. weil ich nicht wußte dass das geht und nicht weiß wie das geht
2. weil das für mich eine Philosophie-Frage ist. Die Datei ist etwas, was die Anwendung braucht, also muss sie schon da sein, find ich. Die Anwendung soll sich darum nicht kümmern müssen. Und wenn einer die Datei manuell weglöscht, muss er die App eben neu installieren.
3. WEIL ES JETZT FUNKTIONIERT!!!!!!!! :)

Ich blick es zwar auf keinem Auge, aber es funktioniert!!!

vorher:
1private Uri uri = new Uri.Builder().scheme("package").encodedOpaquePart("com.example.test.Broadcast.TestUpdateReceiver").build();

hatte nicht funktionert.
Dann hab ich daraus das gemacht:
1private Uri uri = new Uri.Builder().scheme("package").encodedOpaquePart("com.example.test").build();

ohne das .Broadcast.TestUpdateReceiver, und auf einmal hat's funktioniert!!! :)

Und hier liegt wohl irgendwo auch noch ein Denkfehler meinerseits:

1@Override
2 public void onReceive(Context _context, Intent _intent)
3 {
4 String txt = null;
5 String txt2 = null;
6
7 txt = _intent.getDataString();
8 Log.i(LOG_TAG, txt);
9
10 txt2 = "uri-pfad = " +uri.getPath();
11 Log.i(LOG_TAG, txt2);
12
13
14
15 if (uri.equals(_intent.getData()))
16 {
17 Log.i(LOG_TAG, "TestUpdateReceiver called");
18 createTestTxt( _context,"test.txt");
19 }
20 else
21 Log.i(LOG_TAG, "else-Ast von TestUpdateReceiver!!! Hallo hier!!!!");
22
23 }

und bei Log.i(LOG_TAG, txt2); stand im LogCat immer uri-pfad = null

In dem Fall ist das wohl was anderes... :)

Na, wie gesagt so ganz blick ich's noch nicht, aber die Datei wird angelegt. Juhu. :)

VG,
Eve

— geändert am 11.06.2013, 19:51:24

Antworten