ABA


"יש כאן מישהו שמתכנת לאנדרואיד ? אני רוצה לעשות כפתור שיופיע על המסך בזמן שיחה"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #11143 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 11143
Finlandia לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.10.08
4760 הודעות, 1 פידבק
   15:11   18.01.13   
אל הפורום  
  יש כאן מישהו שמתכנת לאנדרואיד ? אני רוצה לעשות כפתור שיופיע על המסך בזמן שיחה  
 
   אני מעוניין ליצור כפתור שיהיה "allways on top" מהרגע שנכנסת שיחה ועד שהיא מסתיימת... (לא איכפת לי שהכפתור יהיה רק בdialer או תמיד על המסך אבל אני לא מעוניין ליצור dialer חדש הבנתי שזה סיפור)

דוגמא לכפתור כזה אתם יכולים לראות באפליקציה "call tricks" במרקט (הפתור מופיע תמיד על המסך לא משנה באיזה חלון אני נמצא כל עוד אני בשיחה).

אם למישהו יש המלצה אחרת או דרך יצירתית יותר להגיע לאפליקציה דרך השיחה מלבד כמובן האייקון הרגיל של האפליקציה אני אשמח לשמוע

שבת שלום


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  עדכון : Finlandia 18.01.13 17:18 1
  פינלנדיה יא אח מה קורה חומוס 20.01.13 20:20 2
     נהיית שפיץ אה:) יוחאי 20.01.13 20:59 3
     איזה מלךךךך! כמה שאלות. Finlandia 20.01.13 21:21 4
         מכתב חומוס 20.01.13 23:28 5
             עכשיו אני מבין איזה שטויות כתבתי לך שם... קודם תודה רבה אתה עוזר מאוד אבל עדיין Finlandia 21.01.13 01:20 6
                 למה אתה צריך לרשת מPhoneStateListener? חומוס 21.01.13 06:34 7
                     אוקיי אז ככה הצלחתי לעשות את זה ופתרת לי את הבעיה בעצם בתוך הService שנתת לי Finlandia 25.01.13 02:18 8
                         מתי אתה רוצה בדיוק שהכפתור ייעלם? חומוס 25.01.13 08:38 9
                             תודה רבה יא מלך עזרת לי מאוד !! Finlandia 30.01.13 02:28 10

       
Finlandia לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.10.08
4760 הודעות, 1 פידבק
   17:18   18.01.13   
אל הפורום  
  1. עדכון :  
בתגובה להודעה מספר 0
 
   הצלחתי להציג toast במהלך השיחה בעזרת הקוד הבא :
http://stackoverflow.com/questions/5948961/how-to-know-whether-i-am-in-a-call-on-android

אבל איך אני מציג כפתור ? ניסיתי ליצור Layout בתוך הcase הרלוונטי ואליו להוסיף כפתור או imageView אבל הוא לא עושה כלום ...

יש הצעות ?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
חומוס לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 22.4.02
13069 הודעות, 5 פידבק
   20:20   20.01.13   
אל הפורום  
  2. פינלנדיה יא אח מה קורה  
בתגובה להודעה מספר 0
 
עשיתי דה-קומפילציה לאפליקציה הזאת שאמרת CALL TRICKS
וראיתי מה הוא עשה שם.

יש פה איזה טריק (כמו השם של האפליקציה..)

בעיקרון אתה צריך להתחיל Service כאשר אתה מזהה ששיחה נכנסת (ראיתי שאתה
כבר יודע איך עושים את זה)

בסרביס תחזיק איזשהו כפתור שאותו תצטרך להצמיד לWindowManager.
ואז תצטרך לעשות כמה פעולות על הLayoutParams של הWindowManager

הנה הדוגמא של הסרביס:


public class MyService extends Service
{
private Button button = null;
private DisplayMetrics displayMetrics;

@Override
public IBinder onBind(Intent arg0)
{
return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
button = new Button(getApplicationContext());
button.setText("asdfasdfasdfsadf");
WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams();
localLayoutParams.format = WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON;
localLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
localLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
WindowManager localWindowManager = (WindowManager) getSystemService("window");
this.displayMetrics = new DisplayMetrics();
localWindowManager.getDefaultDisplay().getMetrics(this.displayMetrics);
localLayoutParams.width = (this.displayMetrics.widthPixels / 4);
localLayoutParams.height = (this.displayMetrics.heightPixels / 8);
localWindowManager.addView(this.button, localLayoutParams);
this.button.setOnClickListener(new View.OnClickListener()
{
public void onClick(View paramAnonymousView)
{
Toast.makeText(getApplicationContext(), "HEYYYYYYYYYY", Toast.LENGTH_SHORT).show();
}
});

return super.onStartCommand(intent, flags, startId);
}
}

בלחיצה על כפתור תעשה מה שבא לך... אני הקפצתי TOAST לדוגמא

עכשיו.. הטריק הוא לשים בManifest את השורה הבאה
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />


מקווה שעזרתי לך


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
יוחאי
חבר מתאריך 30.12.15
163 הודעות
   20:59   20.01.13   
אל הפורום  
  3. נהיית שפיץ אה:)  
בתגובה להודעה מספר 2
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Finlandia לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.10.08
4760 הודעות, 1 פידבק
   21:21   20.01.13   
אל הפורום  
  4. איזה מלךךךך! כמה שאלות.  
בתגובה להודעה מספר 2
 
   ערכתי לאחרונה בתאריך 20.01.13 בשעה 21:34 בברכה, Finlandia
 
קודם כל אני חייב שתלמד אותי איך עושים דה קומפילציה ומה צריך בשביל זה !!
דבר שני העתקתי את הקלאס שעשית פה ואני לא מצליח להגיע למטודה onStartCommand (ניסיתי לשים אותה כinner class וגם לא... הוא פשוט מבקש ממני להפוך את המטודה onStartCommand לסטטית ומצד שני המחלקה MyService לא מאפשרת לי לעשות אותה סטטית כי היא משתמשת במטודות שלא יכולות להיות סטטיות קיצר נהיה לי בלגן שלם חח...

מה עושים יאח ?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
חומוס לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 22.4.02
13069 הודעות, 5 פידבק
   23:28   20.01.13   
אל הפורום  
  5. מכתב  
בתגובה להודעה מספר 4
 
דבר ראשון אתה צריך לקחת את הקובץ APK ולהפוך אותו לJAR בעזרת DEX2JAR
אחר כך אתה עושה דה קומפילציה לקובץ הJAR על מנת שתוכל לראות את הקלאסים - בעזרת הכלי JD-GUI.
יש פה מדריך קצר כולל לינקים:
http://code.google.com/p/dex2jar/wiki/UserGuide
אמנם לא תוכל לשלוף לגמרי את הפרוייקט, ואת רוב הקלאסים לא תוכל להריץ
כי DEX2JAR לא עושה עבודה בצורה מושלמת, אבל עדיין תוכל לשלוף המון מידע.

אם אתה רוצה בנוסף לראות את הRESOURCES והMANIFEST, תשתמש בכלי שנקרא APK TOOL
http://code.google.com/p/android-apktool/

בנוגע למה שאתה רוצה לעשות:
קודם כל תקרא קצת על SERVICE, אחת הקומפוננטות הכי חשובות ופופולריות
באנדרואיד:
http://developer.android.com/reference/android/app/Service.html

אתה לא יכול להשתמש במטודה onStartCommand ישירות. היא מטודה שנקראת
כחלק ממחזור החיים של הSERVICE, בדיוק כמו onCreate של הקלאס Activity.

אתה צריך לרשום את הService בManifest ואז להפעיל אותו עם Intent
בדיוק כמו שמפעילים Activity (או כמעט כל דבר אחר באנדרואיד).

מקווה שעזרתי לך לבנתיים D:


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Finlandia לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.10.08
4760 הודעות, 1 פידבק
   01:20   21.01.13   
אל הפורום  
  6. עכשיו אני מבין איזה שטויות כתבתי לך שם... קודם תודה רבה אתה עוזר מאוד אבל עדיין  
בתגובה להודעה מספר 5
 
   ערכתי לאחרונה בתאריך 21.01.13 בשעה 01:37 בברכה, Finlandia
 
יש לי בעיה לקרוא לservice הזה כי אני נמצא במחלקה שעושה extends PhoneStateListener.
לא הצלחתי ליצור intent שם כי אני לא יודע להגדיר לו מאיפה אני בא הוא לא מכיר את זה ...
ניסיתי משהו כזה
;((startService(new Intent(this, Categories.class
או סתם ליצור אינטנט אבל הוא לא נותן כנראה בגלל שאני לא נמצא בclass שעושה extends Activity...

יש לך רעיון איך לעשות את זה או שאולי הצלחת לראות איך הוא עושה את זה ?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
חומוס לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 22.4.02
13069 הודעות, 5 פידבק
   06:34   21.01.13   
אל הפורום  
  7. למה אתה צריך לרשת מPhoneStateListener?  
בתגובה להודעה מספר 6
 
אתה יכול לקבל את זה כשידור של המערכת - Broadcast ומשם להתחיל את
הסרביס בעזרת הContext שמגיע עם המטודה onRecieve

הנה 2 דוגמאות:
http://stackoverflow.com/questions/5497061/detecting-outgoing-call-and-call-hangup-event-in-android
http://stackoverflow.com/questions/14001512/android-code-to-pick-the-voice-through-call

אתה רושם את הBroadcast Receiver בManifest תחת התגיד Application על מנת
שהוא יאזין לBroadcast כל עוד האפליקציה בחיים (בדיוק כמו שההוא עשה בדוגמא הראשונה).

בכל אופן אם אתה מתעקש על הקלאס שיורש ממPhoneStateListener, אתה יכול
פשוט להעביר אליו Context בקונסטרקטור ולשמור אותו שם כמשתנה גלובלי.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Finlandia לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.10.08
4760 הודעות, 1 פידבק
   02:18   25.01.13   
אל הפורום  
  8. אוקיי אז ככה הצלחתי לעשות את זה ופתרת לי את הבעיה בעצם בתוך הService שנתת לי  
בתגובה להודעה מספר 7
 
   פשוט השתמשתי ב ()getApplicationContext כמו שעשית בService, והפעלתי Intent וזה עובד פיקס. עכשיו יש בעיה אחרת, ברגע שאני לוחץ על הכפתור הזה הוא מעביר אותי למסך מסויים בתוך האפליקציה עצמה... עד כאן הכל עובד כמו שצריך... הבעיה שבגלל שאני כבר לא בתוך ה Service אין לי גישה לכפתור.. אני לא יכול לבטל אותו ואז הוא נשאר על המסך גם שהשיחה מסתיימת והוא בעצם תקוע שם...

בקוד שלי אני יכול לזהות גם מתי שיחה מסתיימת (באותו case שאני מזהה שהיא מתחילה וקורא לService) אז הפכתי את הכפתור בService לסטטי וניסיתי לגשת אליו כשהשיחה מסתיימת ופשוט לעשות לו (button.setVisibility(View.INVISIBLE או פשוט לקרוא שם ל ()stopService עם אותו Intent שתסגור לי את הService אבל זה לא עובד...

מה אומר הדוקטור איך אני מעיף תכפתור הזה שהשיחה מסתיימת?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
חומוס לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 22.4.02
13069 הודעות, 5 פידבק
   08:38   25.01.13   
אל הפורום  
  9. מתי אתה רוצה בדיוק שהכפתור ייעלם?  
בתגובה להודעה מספר 8
 
בכל אופן, תוכל להוריד את הכפתור נניח על ידי כך שתסיים את הסרביס
(אני מניח שאין לך צורך בסרביס אחרי שלחצו על הכפתור - כי כבר עשית את מה
שאתה צריך לעשות)

מסיימים סרביס כמעט באותה צורה שמתחילים אותו (stop במקום start)


Your_Context.stopService(new Intent(Your_Context, YourService.class)

זה יגרום למטודה onDestroy של הסרביס להקרא(בדיוק כמו onDestroy של Activity שנקרא ברגע שהActivity מסיים את חייו)

ואז שם תסיר מהWindowManager את הכפתור:



@Override
public void onDestroy()
{
WindowManager localWindowManager = (WindowManager) getSystemService("window");
localWindowManager.removeView(your_button);
}


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Finlandia לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.10.08
4760 הודעות, 1 פידבק
   02:28   30.01.13   
אל הפורום  
  10. תודה רבה יא מלך עזרת לי מאוד !!  
בתגובה להודעה מספר 9
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net