اذهب إلى المحتوى

السؤال

نشر

مرحبا جميعا ي اخوان

سبق وانا طرحت سوال مشابه ولكني حاولت اعدل عليه الان ولم اجد خيار لتعديل لذلك فتحت سوال جديد ..

 

لدي سورس كود مربوط بقاعدة البيانات mysql و ملفات php ويتصل من خلال مكتبة volley

احتاج مساعده ل اضافة نظام التنبيهات او الاشعارات فيه بنفس الطريقه المشروع الاتصال من خلال مكتبة volley وملفات php حتى افهم الامر اذا كان ذلك ممكن العمل به طبعا الفكره تكون الرد على موضوع العضو ف يذهب اشعار الى العضو الذي نشو الموضوع تنبيه لقد تم اضافة تعليق جديد لموضوعك وما شابه مثل ذلك ما احتاجه

 

 

Recommended Posts

  • 0
نشر

يمكن ذلك من خلال ارسال طلب الى السرفر كل مدة معينة لترى ان كانت هنالك أي بيانات جديدة و في حالة وجود بيانات جديدة تظهرها للمستخدم .

 

اقتباس

و لكن السؤال ها هنا كيف نفرق بين البيانات الجديدة و القديمة التي سبق أن رآها مستخدم التطبيق ؟

الجواب على هذا السؤال بسيط ، فيمكن التفريق بين البيانات الجديدة و القديمة بهذه الطريقة التي سأوضحها في المثال التالي :

  1. ليكن لدينا مثلا جدول في قاعدة البيانات خاص ب المنشورات (Posts) و هذا الجدول يتكون من الأعمدة التالية :  Id , Content  مع العلم أن أي post يضاف لقاعدة البيانات سيكون ال id الخاص به أكبر من id ال post الذي قبله ( هذه خاصية increment primary key ) .
  2. ننشأ function في السرفر تستقبل id  اخر post رآه مستخدم التطبيق و ترجع  متغير boolean  يمثل وجود أو عدم وجود post جدد في قاعدة البيانات و ذلك بمقارنة ال Id الذي استقبلته ال function مع id آخر post أضيف لقاعدة الباينات .
  3. في تطبيقك تقوم دوما بتخزين id اخر post رآه المستخدم في التطبيق .
  4. في كل مدة معينة سترسل  request الى السرفر من خلال  تطبيقك مرفقة بال id  سبق تخزينه ، طبعا ال request  يستدعي ال function التي سبق انشاءها و هي بدورها تفيدنا ان كان هنالك post جدد و هكذا نظهر الاشعار في التطبيق في حالة  وجود post جديد طبعا .
  • 0
نشر

@عماره ميلودي

هلا بك عزيزي

والله ي اخوي انا مطور تطبيقات ما جديد ميه ب ميه ولكن خبرتي قليله جدا

ياليت اذا معك مثال على الي شرحته ترفقه الي او ارفق لك سورس كود بسيط فيه كل الاحتياجات وتضيف لي هذا الخاصيه فيه اذا ممكن 

  • 0
نشر

@عماره ميلوديتابعة الشرح كامل يوجد بعض الاختلاف بين ما يفعله ومشروعي ولكن هذا ليست المشكله حسب التعليقات على المقطع

الطريقة هذا تشتغل على الاصدارت الاندرويد القديمة فقط 

ايضا السيرفر يشتغل اثناء تشغيل التطبيق فقط يعني لو المستخدم غلق التطبيق او خرج منه ما رح يستلم الاشعارات 

  • 0
نشر
بتاريخ 5 ساعات قال مروان مروان3:

ياليت اذا معك مثال على الي شرحته ترفقه الي او ارفق لك سورس كود بسيط فيه كل الاحتياجات وتضيف لي هذا الخاصيه فيه اذا ممكن 

السلام عليكم أخي ,حسب ما فهمت إنك تريد إرسال إشعار من التطبيق عند قيام المستخدم بوضع تعليق جديد على بوست معين ,يمكنك ذلك من خلال إرجاع عدد التعليقات الحالي والتحقق إن كان هناك زيادة في العدد إن حدث زيادة نقوم بتفحص التعليقات من أخر عدد للتعليقات ثم عمل إشعار بتلك التعليقات من الAPI او السيرفر الخاص بك,ولعمل إشعار يمكنك إستخدام الكود التالي مع تعديله بما يتناسب مع تطبيقك (جافا) 

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("قام مستخدم بالتعليق على منشورك")
        .setContentText("قام مستخدم بإضافة تعليق جديد!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT);

وأيضا لإرسال إشعار حتى عند إغلاق التطبيق ,يتم إستخدم Background service وهي تعمل بالخلفية حتى عند إغلاق التطبيق تستمر بالعمل وتقوم هنا بالتفحص للإشعارات الجديدة 

  • 0
نشر

@Mohamd Imran

اهلا بك اخي الكريم

شكرا على ردك في بداية الامر

لقد قمت بعمل كلاس سيرفر حسب تعليماتك انته والاخ @عماره ميلوديله الشكر الجزيل ايضا

وقمت بعمل كلاس فولي في كلاس السيرفر وقمت بعمل توقيت لكلاس السيرفر ايضا 

 Handler handler=new Handler();
        handler.postDelayed(new Runnable(){
            @Override
            public void run() {
                run_loop();
            }
            },20000);

ايضا قمت بادرج كلاس السيرفر كالتالي في الصفحة main 

 

  @Override
    public void onBackPressed() {
        Intent sr =new Intent(MainActivity.this,MyService.class);
        startService(sr);
        Toast.makeText(this, "Exit", Toast.LENGTH_SHORT).show();
        finish();
        super.onBackPressed();
    }

المفترض اني لما اعمل خروج من التطبيق ب الشكل التالي احصل على اشعار توست مسج السيرفر شغال هذا المساج اشاهده ولكن من بعدها لا يحدث شي الفولي لا تحضر الي اخر ايدي موجود في جدول المواضيع انا حاليا احاول احصل على اشعار باخر المواضيع حتى بعدها استطيع التعديل على الكود وعمله بشكل مختلف ولكن لا يزال لا يعمل 

 

هذا كلاس السيرفر كامل مرفق لكم 

 

public class MyService extends Service {
    public MyService() {
    }

    @Override
    public void onCreate(){
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent,int flags,int startId){
        Toast.makeText(this, "Start myServis", Toast.LENGTH_LONG).show();
        run_loop();
        return START_STICKY;
    }

    public void run_loop(){
       final RequestQueue mRequestQueue;
        mRequestQueue = Volley.newRequestQueue(this);
        String url =  "http://0000000/testnet/android_register_login/ShowAllData.php";
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            JSONArray jsonArray = response.getJSONArray("data");
                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject hit = jsonArray.getJSONObject(0);
                                String idtopic =response  .getString("idtopic");
                                int lastThread=Integer.parseInt(String.valueOf(idtopic));
                                JSONObject jsonObject = null;
                                Toast.makeText(MyService.this, lastThread+":", Toast.LENGTH_LONG).show();

                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        });

        mRequestQueue.add(request);



        Handler handler=new Handler();
        handler.postDelayed(new Runnable(){
            @Override
            public void run() {
                run_loop();
            }
            },20000);

    }





    @Override
    public void onDestroy(){
        Toast.makeText(this, "Stopmyservci", Toast.LENGTH_LONG).show();
       super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

 

مع العلم ان موقع الصفر هو IP كمبيوتري 

 

وهذا صفحة php وهيا شغاله 100%100 قمت بتجربتها من خلال المتصفح ومن خلال رابط الفولي بعد الضغط عليه 

<?php
include ("connt.php");

$sql="SELECT * FROM `topic` ORDER BY idtopic DESC";
$result=mysqli_query($con,$sql);

$data=array();
while($row=mysqli_fetch_assoc($result)){
//$data[]=$row;
$data["data"][]=$row;
}
	
			
	echo json_encode($data);

	
	?>

 

وهذا صورة من جدول البيانات الذي احاول الحصول على العدد منه او العمل عليه 

https://gofile.io/d/n2uDuX

لا اعلم ما هيا المشكله بتحديد في الامر

 

اخي  @Mohamd Imran بعد ان احصل على العدد في توست مسج بقدر استخدم كود التنبيهات الذي قمت بمشاركته معي سابقا 

 

مرفق لكم المشروع كامل ايضا لو امكنكم الاتطلاع عليه 

 

Allproject.rar

  • 0
نشر

أهلا بك @مروان مروان3
أتوقع أنك لم تقم بتعريف ال Background service في ملف ال mainfest  , تأكد من ذلك ,وأيضاً إن كنت تقوم بتجربة التطبيق على جهاز ذو نظام أندرويد ٨,٩ سيظهر لك في شريط الإشعارات عند غلق التطبيق سيظهر لك أن هناك عملية تجري في الخلفية تأكد من ذلك ,وأيضاً إذهب إلى التطبيق من خلال إعدادات هاتفك وتأكد من إنك أعطيت الصلاحيات للسماح للتطبيق بالعمل في الخلفية ,وأيضا تفقد إن كان هناك أخطاء تظهر في شريط ال Logcat في الأندرويد ستديو وأنت موصل الهاتف بالجهاز

  • 0
نشر (معدل)

@Mohamd Imran

اهلا بك اخي

بنسبة لملف mainfest  لقد قمت باضافة السيرفر فيه كالتالي 

 

 <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="false"></service>

بنسبة الى نوع لجهاز قمت بتجربة على جهازين الاول جهاوي حقيقي نوت 5 

اصدار الاندرويد 7.0

ايضا قمت بتجربته على جيني موشن اندرويد 4.1.1

والنتيجة واحده فقط مسج تسجيل الخروج ومسج عمل السيرفر الذي يظهر 

 

هذا مجموعة الاخطار التي تظهر في شريط logcat

05-29 13:10:32.164 2432-2437/com.example.myapplication D/dalvikvm: GC_CONCURRENT freed 420K, 5% free 12218K/12807K, paused 13ms+12ms, total 48ms
05-29 13:10:32.192 2432-2497/com.example.myapplication D/dalvikvm: GC_FOR_ALLOC freed 402K, 5% free 12196K/12807K, paused 16ms, total 16ms
05-29 13:10:32.220 2432-2497/com.example.myapplication D/dalvikvm: GC_FOR_ALLOC freed 363K, 5% free 12214K/12807K, paused 10ms, total 10ms
05-29 13:10:32.260 2432-2437/com.example.myapplication D/dalvikvm: GC_CONCURRENT freed 357K, 5% free 12241K/12807K, paused 11ms+3ms, total 21ms
05-29 13:10:32.300 2432-2437/com.example.myapplication D/dalvikvm: GC_CONCURRENT freed 407K, 5% free 12262K/12871K, paused 12ms+1ms, total 23ms
05-29 13:10:32.348 2432-2437/com.example.myapplication D/dalvikvm: GC_CONCURRENT freed 401K, 5% free 12290K/12871K, paused 11ms+11ms, total 34ms
05-29 13:10:32.392 2432-2437/com.example.myapplication D/dalvikvm: GC_CONCURRENT freed 429K, 4% free 12390K/12871K, paused 12ms+1ms, total 27ms
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err: org.json.JSONException: No value for idtopic
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at org.json.JSONObject.get(JSONObject.java:354)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at org.json.JSONObject.getString(JSONObject.java:510)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at com.example.myapplication.MyService$1.onResponse(MyService.java:48)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at com.example.myapplication.MyService$1.onResponse(MyService.java:41)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:83)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:106)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at android.os.Handler.handleCallback(Handler.java:615)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:92)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at android.os.Looper.loop(Looper.java:137)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:4745)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at java.lang.reflect.Method.invoke(Method.java:511)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at dalvik.system.NativeStart.main(Native Method)
    
    --------- beginning of /dev/log/system

@Mohamd Imran

تم التعديل في بواسطة مروان مروان3
  • 0
نشر
بتاريخ 28 دقائق مضت قال مروان مروان3:

هذا مجموعة الاخطار التي تظهر في شريط logcat



 

هنا كما يظهر يوجد لديك أخطاء 

32.416 2432-2432/com.example.myapplication W/System.err: org.json.JSONException: No value for idtopic
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at org.json.JSONObject.get(JSONObject.java:354)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at org.json.JSONObject.getString(JSONObject.java:510)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at com.example.myapplication.MyService$1.onResponse(MyService.java:48)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at com.example.myapplication.MyService$1.onResponse(MyService.java:41)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:83)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:106)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at android.os.Handler.handleCallback(Handler.java:615)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:92)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at android.os.Looper.loop(Looper.java:137)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:4745)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at java.lang.reflect.Method.invokeNative(Native Method)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at java.lang.reflect.Method.invoke(Method.java:511)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
05-29 13:10:32.416 2432-2432/com.example.myapplication W/System.err:     at dalvik.system.NativeStart.main(Native Method)
    

الخطأ الأساسي هنا No value for idtopic أي لا يوجد قيمة ل idtopic هل ال API الخاص بك يحوي تلك القيمة ,وأيضا هنا لديك خطأ

  for (int i = 0; i < jsonArray.length(); i++) {
     JSONObject hit = jsonArray.getJSONObject(0);

أنت تقوم بتمرير 0 للميثود getJSONObject وهذا خطأ يجب أن تمرر متغير ال i أي هكذا 

 for (int i = 0; i < jsonArray.length(); i++) {
    JSONObject hit = jsonArray.getJSONObject(i);

حتي يتم الوصول إلى البيانات المرجعة من اللوب ,إن لم يعمل بعد ذلك أعلمني سأقوم ببناء التطبيق وال API لدي وأحللك المشكلة

  • 0
نشر

@Mohamd Imran

هلا بيك ي غالي 

اعذرني على تاخر الرد كنت احاول اكتشف السبب 

فعلا لقد حلت المشكله ربي يعطيك الف صحه وعافيه 

الكود الحين صار شغال الخطاء كان في السطر التالي 

 


                                JSONObject hit = jsonArray.getJSONObject(i);
                                String idtopic =hit  .getString("idtopic");
                        

المفترض استخدم hit بدل response 

الحين هو شغال ولكن فيه مشكله وحده فقط 

لما اضع الكود حسب توصيتك بشكل التالي 

  JSONObject hit = jsonArray.getJSONObject(i);

يصير يقرا لي الاسطر كلها من الاعلى الى الاصغر مسج توست 3 ثم مسج توست 2 ثم مسج توست 1 

 

ولما اكتب السطر بشكل التالي 

 

  JSONObject hit = jsonArray.getJSONObject(0);

ياتي لي باخر ID لدي ولكن يتم تكراره بحسب عدد الاسطر مثلا انا لدي الان 3 سجلات في قاعدة البيانات 

 

يتم اظهار هي 3 ل ث مرات متتاليه خلف بعض 

 

مع العلم بانا كود الVOlley اصبح كالتالي 

 

public void run_loop(){

        String url =  "http://00000000000/testnet/android_register_login/ShowAllData.php";
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            JSONArray jsonArray = response.getJSONArray("data");
                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject hit = jsonArray.getJSONObject(i);
                                String idtopic =hit  .getString("idtopic");
                                int lastThread=Integer.parseInt(String.valueOf(idtopic));
                                JSONObject jsonObject = null;
                                Toast.makeText(MyService.this, lastThread+":", Toast.LENGTH_SHORT).show();

                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        });


        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(request);


        Handler handler=new Handler();
        handler.postDelayed(new Runnable(){
            @Override
            public void run() {
                run_loop();
            }
            },20000);

    }

 

@Mohamd Imran

قمت بعمل الكود كالتالي الان التوست مسج يظهر ولكن الاشعارات لا تظهر في الاعلى 

 

  public void run_loop(){

        String url =  "http://00000000/testnet/android_register_login/ShowAllData.php";
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            JSONArray jsonArray = response.getJSONArray("data");
                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject hit = jsonArray.getJSONObject(i);
                                String idtopic =hit  .getString("idtopic");
                                int lastThread=Integer.parseInt(String.valueOf(idtopic));
                                JSONObject jsonObject = null;
                                Toast.makeText(MyService.this, lastThread+":", Toast.LENGTH_SHORT).show();
                                NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext())
                                        .setSmallIcon(R.drawable.ic_launcher_background)
                                        .setContentTitle("قام مستخدم بالتعليق على منشورك")
                                        .setContentText("قام مستخدم بإضافة تعليق جديد!")
                                        .setPriority(NotificationCompat.PRIORITY_DEFAULT);
                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        });


        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(request);


        Handler handler=new Handler();
        handler.postDelayed(new Runnable(){
            @Override
            public void run() {
                run_loop();
            }
            },20000);

    }

 

  • 0
نشر
بتاريخ 10 دقائق مضت قال مروان مروان3:

ياتي لي باخر ID لدي ولكن يتم تكراره بحسب عدد الاسطر مثلا انا لدي الان 3 سجلات في قاعدة البيانات 

 

صحيح ,وهو هكذا سيأتي لك بجميع السجلات التي يتم إرجاعها من ال API على عددها لاحظ هنا في ال for loop  إستخدمنا طول المصفوفة jsonArray.length() أي مثلاً تم إرجاع ٣ سجلات فإنه سيظهر ٣ سجلات بناء على عدد العناصر في المصفوفة 

  for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject hit = jsonArray.getJSONObject(i);
                                String idtopic =hit  .getString("idtopic");
                                int lastThread=Integer.parseInt(String.valueOf(idtopic));
                                JSONObject jsonObject = null;
                                Toast.makeText(MyService.this, lastThread+":", Toast.LENGTH_SHORT).show();

                            }

لكن إن أردت فقط عرض سجل واحد يمكنك عمل التالي للوب بدل jsonArray.length() ضع الرقم - 1

 for (int i = 0; i < 2; i++) {
          JSONObject hit = jsonArray.getJSONObject(i);
          String idtopic =hit  .getString("idtopic");
          int lastThread=Integer.parseInt(String.valueOf(idtopic));
          JSONObject jsonObject = null;
         Toast.makeText(MyService.this, lastThread+":", Toast.LENGTH_SHORT).show();

         }

وهكذا سيرجع لك سجل واحد 

  • 0
نشر

@Mohamd Imran

 

  JSONObject hit = jsonArray.getJSONObject(0);
                                String idtopic = hit.getString("idtopic");
                                int lastThread = Integer.parseInt(String.valueOf(idtopic));
                                JSONObject jsonObject = null;
                                Toast.makeText(MyService.this, lastThread + ":", Toast.LENGTH_SHORT).show();

عملت ازاله for كامل وهو شغال ايضا تمام ي غالي 

 

بس باقي مشكلة ظهور التنبيه بدل التوست مسج وحسب ما فهمت الان ايضا يجب عمل قناة مع الاندويد الجديد

انا جربت الكود الذي ادرجته انته ولكن لم يظهر شي لي

  • 1
نشر
بتاريخ 15 دقائق مضت قال مروان مروان3:

بس باقي مشكلة ظهور التنبيه بدل التوست مسج وحسب ما فهمت الان ايضا يجب عمل قناة مع الاندويد الجديد

 

صحيح ,لعمل إشعار لجميع إصدرات أندرويد قمت بعمل الكود التالي لك ,سيتفحص إصدار الأندرويد لديك وسيتم إطلاق الإشعار بالطريقة المناسبة للإصدار الجديد

final int NOTIFY_ID = 1002;

        
        String name = "my_package_channel";
        String id = "my_package_channel_1"; //  يمكنك إبقائه كماهوid القناة
        String description = "my_package_first_channel"; //  يمكنك إبقائه كما هو وصف القناة

        Intent intent;
        PendingIntent pendingIntent;
        NotificationCompat.Builder builder;

        if (notifManager == null) {
            notifManager =
                    (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel mChannel = notifManager.getNotificationChannel(id);
            if (mChannel == null) {
                mChannel = new NotificationChannel(id, name, importance);
                mChannel.setDescription(description);
              //تفعيل الرجاج 
                mChannel.enableVibration(true);
                mChannel.setLightColor(Color.GREEN);
                //تشغيل الرجاج 
                mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
                notifManager.createNotificationChannel(mChannel);
            }
            builder = new NotificationCompat.Builder(this, id);

            intent = new Intent(this, MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

            builder.setContentTitle("تعليق جديد")  
                    .setSmallIcon(android.R.drawable.ic_popup_reminder) // هنا ضع أيقونة من مجلد drawable
                    .setContentText("قام مستخدم بالتعليق على منشورك")  
                    .setDefaults(Notification.DEFAULT_ALL)
                    .setAutoCancel(true)
                    .setContentIntent(pendingIntent)
                    .setTicker(title)
                    .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
        } else {

            builder = new NotificationCompat.Builder(this);

            intent = new Intent(this, MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

            builder.setContentTitle("تعليق جديد")                           
                    .setSmallIcon(android.R.drawable.ic_popup_reminder) // هنا ضع أيقونة من مجلد drawable
                    .setContentText("لديك تعليق جديد")  
                    .setDefaults(Notification.DEFAULT_ALL)
                    .setAutoCancel(true)
                    .setContentIntent(pendingIntent)
                    .setTicker(title)
                    .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400})
                    .setPriority(Notification.PRIORITY_HIGH);
        }

        Notification notification = builder.build();
        notifManager.notify(NOTIFY_ID, notification);

 

  • 0
نشر
بتاريخ 4 دقائق مضت قال مروان مروان3:

Cannot resolve symbol 'notifManager'

 

اه أعتذر لم أقم بتعريف ال notification manger في الكود فقط أضف التالي فوق جملة الشرط أي هكذا 

NotificationManager notifManager =
    (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
if (notifManager == null) {
            notifManager =
                    (NotificationManager)getSystemService(this.NOTIFICATION_SERVICE);
        }

وبخصوص هذا

بتاريخ 4 دقائق مضت قال مروان مروان3:

'Builder(android.content.Context)' is deprecated

 

من الأندرويد ستديو هذا تحذير للإصدارات القديمة لكن لا عليك منه 

  • 0
نشر (معدل)

@Mohamd Imran

لقد صار شغال ميه ميه ربي يعطيك الف صحه وعافيه يا غالي وربي يقدرني وارجع لك هذا الفضل ما قصرت معي وربي حليت مشكله كبيره في تطبيقي 

 

سوال اخير بس ي غالي لو بكلف عليك

الان  احنا عملنا الكود في كلاس my server وهو شغال ميه ميه ولكن لو بغينا 

نعمل لكلاس في صفحة التعليقات عشان يجيب تعليقات الاعضاء اشلون بنربط الداله هذا الخاصه ب الفولي  او ب جلب البيانات ب السيرفر عشان تصير تشتغل كل شوي ؟ 

الفكره حقيقي هذا ما واضحه معي فيها نوعا من الغموض لنه الان الكود يجيب لي جميع الادروس في الجدول او التعليقات ولكن بشكل عام لتطبيق 

@Mohamd Imran

في الاصدارات الجديده يعمل نظام الاشعارات 

في القديمه يعمل ولكن يحدث كراش ل تطبيق وينهار مع وجود لوجت التالي 

 

05-29 17:55:33.310 1955-1955/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.SecurityException: Requires VIBRATE permission
        at android.os.Parcel.readException(Parcel.java:1425)
        at android.os.Parcel.readException(Parcel.java:1379)
        at android.app.INotificationManager$Stub$Proxy.enqueueNotificationWithTag(INotificationManager.java:295)
        at android.app.NotificationManager.notify(NotificationManager.java:124)
        at android.app.NotificationManager.notify(NotificationManager.java:103)
        at com.example.myapplication.MyService.notifaction(MyService.java:95)
        at com.example.myapplication.MyService.access$000(MyService.java:29)
        at com.example.myapplication.MyService$1.onResponse(MyService.java:128)
        at com.example.myapplication.MyService$1.onResponse(MyService.java:117)
        at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:83)
        at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:106)
        at android.os.Handler.handleCallback(Handler.java:615)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4745)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)
05-29 17:55:33.522 1955-1959/com.example.myapplication D/dalvikvm: GC_CONCURRENT freed 361K, 6% free 12220K/12871K, paused 12ms+15ms, total 63ms

ايضا توجد مشكلة التكرار هو شغال هو الوقت هذا مافيها مشكله المشكله يعطيني اخر رقم طول الوقت يعني يكرر العملية بدون توقق المتفرض اذا كان الرقم ك السابق لا يرسل لي اشعارات لني قد سبق وقرارت المووضوع

تم التعديل في بواسطة مروان مروان3
  • 0
نشر
بتاريخ 18 دقائق مضت قال مروان مروان3:

نعمل لكلاس في صفحة التعليقات عشان يجيب تعليقات الاعضاء اشلون بنربط الداله هذا الخاصه ب الفولي  او ب جلب البيانات ب السيرفر عشان تصير تشتغل كل شوي ؟ 

 

هي فعلياً تعمل دائما في الخلفية (تختلف في بعض إصدارات الأندرويد),أي لا تحتاج إلى تشغيلها كل مدة , لكن أفضل إداء أو أسلوب لعمل هكذا نوع من التطبيقات ,أن تقوم بعمل قاعدة بيانات محلية sqllite db  وتخزين البيانات القادمة من ال API في تلك القاعدة حتى عند عدم توفر إتصال بالإنترنت ينطلق الإشعار بناء على البيانات المحملة مسبقاً من ال API ومن هنا تستطيع عمل كويري لقاعدة البيانات المحلية (أو من خلال عمل API لتلقي الطلبات وإعادة إرسال التعليقات بناء على Id مستخدم معين) لطلب التعليقات الجديدة لمستخدم معين 

  • 0
نشر
بتاريخ 1 دقيقة مضت قال مروان مروان3:

ولكن انا كنت اقصد هل دائما الكود ينكتب في كلاس السيرفر او ممكن كتابته في الكلاسات الثانيه اي في موقع الذي ارغب باستخدمه فيه؟اذا ممكن كيف رح نربطه في كلاسات الثانيه من اجل ان يعمل ؟

 

بالتأكيد لا ,فقط قم بإضافة الفنكشن الذي تريد أن يعمل في الخلفية إلى كلاس السيرفس وإلا سيسبب ذلك إرهاق المعالج الخاص بالجوال وضغط فقط أبقي  على المهام التي لا تستهلك طاقة المعالج غير ذلك ممكن كتابته في الكلاسات الأخرى :) مكان ما تريد تستخدمها 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...