محمدرضا شاهپیری 5,569 ارسال شده در 21 مهر، ۱۴۰۲ اشتراک گذاری ارسال شده در 21 مهر، ۱۴۰۲ سلام و درود. امیدوارم حالتون خوب باشه از بین چهار کامپوننت اصلی اندروید رسیورها یکی از مهمترینهاش هست. از اونها برای اسال رویداد بین برنامه ها و یا بین خود کامپوننتها استفاده میشه. همینطور برای دریافت اعلانهای سیستمی مثل اس ام اس یا تماس ازشون استفاده میشه. این قابلیت جدیدا به صورت نیتیو به b4a اضافه شده هر چند کامل این کار رو نکرده. بریم که ببینیم به چه شکل باید استفاده کنیم. اول از منوی Project->Add New Module->Receiver Module یه رسیور مثلا به نام TestReceiver ایجاد میکنیم. Sub Process_Globals End Sub Private Sub Receiver_Receive (FirstTime As Boolean, StartingIntent As Intent) Log(StartingIntent.Action) End Sub به طور کلی به دو صورت میتونیم رسیورها رو توی اندروید ثبت کنیم. 1- از طریق منیفست یا استاتیک: یکی از روشهای ثبت رسیور از طریق منیفست هست. البته این روش برای اکثر اعلانها تو نسخه های جدید اندروید غیر فعال شده. مثلا میخوایم بوت شدن دستگاه رو بفهمیم. به منیفست کدهای زیر رو اضافه میکنیم. AddPermission(android.permission.RECEIVE_BOOT_COMPLETED) AddReceiverText(TestReceiver, <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter>) 2-از طریق کدنویسی یا داینامیک: اینجا رو دیگه ارل یادش رفته و براش راه حلی نزاشته. ولی ما که نمیزاریم چیزی لنگ بمونه این روش روش پیشنهادی و استاندارد گوگل هست. کدهای زیر رو به اکتیوتی یا سرویس اضافه کنید اضافه کنید. #If java import android.content.BroadcastReceiver; import android.content.Context; import android.content.IntentFilter; import android.os.Build; import java.lang.reflect.Constructor; public void registerReceiver(Object receiverClass, String[] actions) throws Exception{ IntentFilter intentFilter=new IntentFilter(); for (String action:actions) { intentFilter.addAction(action); } String className=receiverClass.toString().replace("class ",""); Class<?> clazz = Class.forName(className); Constructor<?> cons = clazz.getConstructor(); cons.setAccessible(true); final BroadcastReceiver receiver =(BroadcastReceiver) cons.newInstance(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { registerReceiver(receiver,intentFilter,Context.RECEIVER_EXPORTED); }else { registerReceiver(receiver,intentFilter); } } public void unregisterReceiver(Object receiverClass) throws Exception{ String className=receiverClass.toString().replace("class ",""); Class<?> clazz = Class.forName(className); Constructor<?> cons = clazz.getConstructor(); cons.setAccessible(true); BroadcastReceiver receiver =(BroadcastReceiver) cons.newInstance(); unregisterReceiver(receiver); } #End If و به صورت زیر رسیور رو ثبت کنید. مثلا میخوایم هر وقت دقیقه گوشی عوض شد متوجه بشیم. Dim jo As JavaObject jo.InitializeContext.RunMethod("registerReceiver",Array(TestReceiver,Array As String("android.intent.action.TIME_TICK"))) این مواردی که تا الان عرض شد برای اعلانهای سیستمی هست، اما یکی از مهمترین قابلیتهای رسیور اینه که ما میتونیم رسیور دلخواه خودمونو هم ثبت کنیم که خب خیلی کاربردی هست. مثلا میخوایم یه اعلان با اکشن com.action.TEST ثبت کنیم. به صورت زیر ثبتش میکنیم Dim jo As JavaObject jo.InitializeContext.RunMethod("registerReceiver",Array(TestReceiver,Array As String("com.action.TEST"))) و حالا برای صدا زدن اعلان به شکل زیر عمل میکنیم. اول کتابخونه phone رو تیک میزنیم. Dim phone As Phone Dim i As Intent i.Initialize("com.action.TEST","") i.PutExtra("key","value") phone.SendBroadcastIntent(i) حتما توجه داشته باشین که بعد از استفاده اونو unregister کنید.به شکل زیر Dim jo As JavaObject jo.InitializeContext.RunMethod("unregisterReceiver",Array(TestReceiver,Null)) سورس هم پیوست شد receiver.zip مانا باشید 5 نقل قول لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
سید رضا 9 ارسال شده در 28 مهر، ۱۴۰۲ اشتراک گذاری ارسال شده در 28 مهر، ۱۴۰۲ سلام من مراحل بالا رو پیش رفتم این ارور رو میده B4A Version: 12.50 Parsing code. (0.00s) Java Version: 14 Building folders structure. (0.01s) Compiling code. (0.01s) Compiling layouts code. (0.00s) Organizing libraries. (0.00s) (AndroidX SDK) Compiling resources (0.11s) Linking resources (0.37s) Compiling generated Java code. Error src\b4a\example\main.java:472: error: unreported exception ClassNotFoundException; must be caught or declared to be thrown Class<?> clazz = Class.forName(className); ^ Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. 1 error only showing the first 1 errors, of 3 total; use -Xmaxerrs if you would like to see more javac 14.0.1 نقل قول لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
مهدی عزیزی 0 ارسال شده در 3 آبان، ۱۴۰۲ اشتراک گذاری ارسال شده در 3 آبان، ۱۴۰۲ در ۱۴۰۲/۷/۲۸ در 21:33، سید رضا گفته است: سلام من مراحل بالا رو پیش رفتم این ارور رو میده B4A Version: 12.50 Parsing code. (0.00s) Java Version: 14 Building folders structure. (0.01s) Compiling code. (0.01s) Compiling layouts code. (0.00s) Organizing libraries. (0.00s) (AndroidX SDK) Compiling resources (0.11s) Linking resources (0.37s) Compiling generated Java code. Error src\b4a\example\main.java:472: error: unreported exception ClassNotFoundException; must be caught or declared to be thrown Class<?> clazz = Class.forName(className); ^ Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. 1 error only showing the first 1 errors, of 3 total; use -Xmaxerrs if you would like to see more javac 14.0.1 سلام منم همین مشکل رو دارم نقل قول لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
سید رضا 9 ارسال شده در 3 آبان، ۱۴۰۲ اشتراک گذاری ارسال شده در 3 آبان، ۱۴۰۲ ۱ ساعت قبل، مهدی عزیزی گفته است: سلام منم همین مشکل رو دارم متاسفانه من چندین روزه پرسیدم کسی پاسخگو نیست نقل قول لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
محمدرضا شاهپیری 5,569 ارسال شده در 11 آبان، ۱۴۰۲ سازنده اشتراک گذاری ارسال شده در 11 آبان، ۱۴۰۲ در ۱۴۰۲/۸/۳ در ۲۰:۰۰، مهدی عزیزی گفته است: سلام منم همین مشکل رو دارم در ۱۴۰۲/۸/۳ در ۲۱:۱۱، سید رضا گفته است: متاسفانه من چندین روزه پرسیدم کسی پاسخگو نیست سلام و درود. پست ویرایش شد و سورس هم جهت راحتی کار پیوست شد. نقل قول لینک ارسال به اشتراک گذاری در سایت های دیگر تنظیمات بیشتر اشتراک گذاری ...
ارسالهای توصیه شده
به گفتگو بپیوندید
هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .
توجه: strong> مطلب ارسالی شما پس از تایید مدیریت برای همه قابل رویت خواهد بود.