2

Ben tek ve çift tıklama (tek tuşla) kulaklık düğmesini tespit eden bir uygulama geliştiriyorum. Tek ve çift tıklama iyi çalışıyor, ancak uzun tıklama çalışmıyor. Aşağıdaki kod BroadcastReceiver'ı genişleten bir sınıftadır. Bu sorunu nasıl çözebilirim? Size çok teşekkür ederim.Android - Nasıl hareket medyası düğmesi algılamak uzun basın

@Override 
public void onReceive(Context context, Intent intent) 
{ 
    context1=context; 
    intent1=intent; 
    String intentAction=intent.getAction(); 
    if (!Intent.ACTION_MEDIA_BUTTON.equalsIgnoreCase(intentAction)) 
    { 
     return; 
    } 
    KeyEvent event = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
    if (event == null) { 
     return; 
    } 
    int action = event.getAction(); 
    if (action == KeyEvent.ACTION_DOWN) 
    { 
     // do something 

      d++; 
      Handler handler = new Handler(); 
      Runnable r = new Runnable() 
      { 
       @Override 
       public void run() 
       { 
        // single click ******************************* 
        if (d == 1) 
        { 
         Toast.makeText(context1, "single click!", Toast.LENGTH_SHORT).show(); 
        } 
        // double click ********************************* 
        if (d == 2) 
        { 
         Toast.makeText(context1, "Double click!!", Toast.LENGTH_SHORT).show(); 
        } 
        d = 0; 
       } 
      }; 
      if (d == 1) 
      { 

       handler.postDelayed(r, 500); 
      } 
    } 
    /** 
    * for long click 
    */ 
    if (action == KeyEvent.ACTION_UP) 
    { 
     if (SystemClock.uptimeMillis() - event.getDownTime() > 2000) 
     { 
      Toast.makeText(context, "Long click!", Toast.LENGTH_SHORT).show(); 
     } 
    } 
    abortBroadcast(); 
} 

UPDATE

Bu

public class Main extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener 
{ 
private static final String TAG = "MainActivity"; 
PreferenceFragment pf; 
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.layout_main); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    FragmentManager fragmentManager= getFragmentManager(); 
    SingoloClick singoloClick= new SingoloClick(); 
    FragmentTransaction ft=fragmentManager.beginTransaction(); 
    ft.replace(R.id.content_frame, singoloClick); 
    ft.commit(); 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 
    toggle.syncState(); 

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    navigationView.setNavigationItemSelectedListener(this); 

    IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);//"android.intent.action.MEDIA_BUTTON" 
    MediaButtonIntentReceiver r = new MediaButtonIntentReceiver(); 
    filter.setPriority(999); //this line sets receiver priority 
    registerReceiver(r, filter); 
((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(new ComponentName(getPackageName(), MediaButtonIntentReceiver.class.getName())); 
} 

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

@Override 
public void onBackPressed() 
{ 
    moveTaskToBack(true); 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) 
    { 
     drawer.closeDrawer(GravityCompat.START); 
    } 
    /*else 
    { 
     super.onBackPressed(); 
    }*/ 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) 
    { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    // Handle navigation view item clicks here. 
    int id = item.getItemId(); 
    if (id == R.id.nav_singoloClick) 
    { 
     setTitle(""+getResources().getString(R.string.singoloClick)); 
     FragmentManager fragmentManager= getFragmentManager(); 
     SingoloClick singoloClick= new SingoloClick(); 
     FragmentTransaction ft=fragmentManager.beginTransaction(); 
     ft.replace(R.id.content_frame, singoloClick); 
     ft.commit(); 
    } else if (id == R.id.nav_doppioClick) 
    { 
     setTitle(""+getResources().getString(R.string.doppioClick)); 
     FragmentManager fragmentManager= getFragmentManager(); 
     DoppioClick doppioClick= new DoppioClick(); 
     FragmentTransaction ft=fragmentManager.beginTransaction(); 
     ft.replace(R.id.content_frame, doppioClick); 
     ft.commit(); 
    } else if (id == R.id.nav_lungoClick) 
    { 
    } 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawer.closeDrawer(GravityCompat.START); 
    return true; 
} 


@Override 
protected void onDestroy() 
{ 
    super.onDestroy(); 
    android.os.Process.killProcess(android.os.Process.myPid());*/ 
} 

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

Main.class

olan bu saat için Manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example"> 

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 

<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" 
    android:supportsRtl="true" android:theme="@style/AppTheme"> 
    <activity android:name=".Main" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <receiver android:name=".MediaButtonIntentReceiver"> 
     <intent-filter android:priority="999"> 
      <action android:name="android.intent.action.MEDIA_BUTTON" /> 
     </intent-filter> 
     <intent-filter android:priority="0"> 
      <action android:name="android.intent.action.VOICE_COMMAND" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </receiver> 
</application> 

+0

Gerçek zamanını 'ACTION_DOWN' olarak kaydedebilir ve gerçek zaman> '2000' kontrolünüz için' ACTION_UP' ile karşılaştırabilirsiniz. – Doomsknight

cevap

0

olduğu anahtar üzerinde uzun basına andle:

@Override 
public boolean onKeyLongPress(int keyCode, KeyEvent event) { 
     // TODO Auto-generated method stub 
} 
+0

Bu kodu bir yayın alıcısına koyabilir miyim? –

+0

nope, – GensaGames

1

deneyin i doc bulundu Ne ... KeyEvent.OTHER başka önemli olayı kullanmak için: zaman yakalamak için, başka çözümü:

/** 
    * This flag is set for the first key repeat that occurs after the 
    * long press timeout. 
    */ 
    public static final int FLAG_LONG_PRESS = 0x80; 

GÜNCELLEME , düğmesine basıldığında.

final Timer timer = new Timer(); 
button.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View arg0, MotionEvent arg1) { 
     switch (arg1.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      //start timer 
      timer.schedule(new TimerTask() { 
       @Override 
       public void run() { 
        // invoke intent 
       } 
      }, 5000); //time out 5s 
      return true; 
     case MotionEvent.ACTION_UP: 
      //stop timer 
      timer.cancel(); 
      return true; 
     } 
     return false; 
    } 
}); 

GÜNCELLEME 2:

senin sorunun onTouchEvent dokunmatik olaylarını ele şekli olduğu anlaşılıyor. Bu yöntem ACTION_UP - çalışmıyor! Dokunma olaylarını işlemek istiyorsanız, onTouchEvent öğesinden doğru geri dönmeniz gerekir. Yani, bir ACTION_DOWN alırsanız ve onTouchEvent öğesinden false değerini döndürürseniz, sistem size bir sonraki ACTION_DOWN olayına ilişkin daha fazla dokunma olayı göndermez.

ACTION_DOWN dışındaki herhangi bir dokunma olayını almak istiyorsanız, o butona ait onTouchEvent öğesinden doğru geri dönmeniz gerekir. Ama bunu yapamazsın, başka bir çözüm hakkında düşünmeye ihtiyacım var. KEY_ACTION_UP çalışmaması nedeniyle

Dediğim gibi GÜNCELLEME, bir şey başka bir çözüm oluşturmanız gerekir. Belki de this çözümünü deneyin.

+0

yapamazsınız Ama bu kod Düğme için çalışır. Donanım tuşunun uzun basmasını (kulaklık düğmesi) algıladım. –

+0

Okey. Başka KeyEvent yoksa, zamanlayıcıyı kullanmayı deneyin. Sadece KEY_DOWN eylemi olayına başlatabilir ve KEY_UP’da zamanlayıcıyı durdurur. Uzun tıklamada zamanlayıcı boyutunu kontrol et. – GensaGames

+0

Teşekkür ederim. Yakında çalışacağım ve umarım çalışmasını umuyorum. –