2016-05-15 13 views
0

Я хочу построил простое приложение, которое вибрирует при щелчке на флажке и останавливается после того, как другая мыши:Android вибрирует на флажке

В настоящее время это выглядит следующим образом:

import android.content.Context; 
import android.os.Vibrator; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.CheckBox; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Vibrator vibrator = (Vibrator) MainActivity.this.getSystemService(Context.VIBRATOR_SERVICE); 
     final CheckBox vibrateCheckBox = (CheckBox) findViewById(R.id.checkPowerStrong); 

     if(vibrateCheckBox.isChecked()) { 
      while(vibrateCheckBox.isChecked()) { 
       vibrator.vibrate(1000); 
      } 
     } else { 
      vibrator.cancel(); 
     } 

    } 
} 

Но я получаю сообщение об ошибке :

Caused by: java.lang.IllegalStateException: System services not available to Activities before onCreate()

Я дал манифесту разрешения вибрировать:

, как решить эту

+0

Возможно, добавьте замещающего изменения в этот флажок? Потому что это говорит, что он вибрирует, как только приложение запускается, а не когда флажок установлен. –

+1

Вы не должны получать это исключение с помощью этого кода. –

+0

Не могли бы вы показать мне фрагмент о том, как вы это точно знаете –

ответ

1

Это точно работает, что вы хотите. Сделайте что-нибудь подобное

final Vibrator vibrator = (Vibrator) MainActivity.this.getSystemService(Context.VIBRATOR_SERVICE); 
final CheckBox vibrateCheckBox = (CheckBox) findViewById(R.id.checkPowerStrong); 

final Handler handler = new Handler(); 

final Runnable r = new Runnable() { 
    public void run() { 
     vibrator.vibrate(1000); 
     handler.postDelayed(this, 1000); 
    } 
}; 

vibrateCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { 
      if(vibrateCheckBox.isChecked()) { 
       handler.postDelayed(r, 100); 
      } else { 
       handler.removeCallbacks(r); 
       vibrator.cancel(); 
      } 

     } 
    } 
); 
+0

Это прекрасно работает –

+0

Не могли бы вы объяснить, что именно моя ошибка была –

+0

Upvote is appriciated. – Masum

0
public class MainActivity extends AppCompatActivity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

vibrateCheckBox = (CheckBox)findViewById(R.id.checkPowerStrong); 
vibrateCheckBox.setChecked(false); 
Vibrator v = (Vibrator) this.context.getSystemService(Context.VIBRATOR_SERVICE); 



vibrateCheckBox .setOnCheckedChangeListener(new OnCheckedChangeListener() { 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     if (isChecked) 
     { 
      v.vibrate(500);  // Vibrate for 500 milliseconds 
     }else 
     { 
      v.cancel(); 
     } 
    } 
}); 

} 

Добавить разрешения в Manifest.xml

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

Как вибрирует Бесконечно

// Get instance of Vibrator from current Context 
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 

// Start without a delay 
// Vibrate for 100 milliseconds 
// Sleep for 1000 milliseconds 
long[] pattern = {0, 100, 1000}; 

// The '0' here means to repeat indefinitely 
// '0' is actually the index at which the pattern keeps repeating from (the start) 
// To repeat the pattern from any other point, you could increase the index, e.g. '1' 
v.vibrate(pattern, 0); 

Когда вы будете готовы, чтобы остановить вибрация, просто вызовите метод cancel():

v.cancel(); 

Как использовать вибрационные паттерны

If you want a more bespoke vibration, you can attempt to create your own vibration patterns: 

// Get instance of Vibrator from current Context 
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 

// Start without a delay 
// Each element then alternates between vibrate, sleep, vibrate, sleep... 
long[] pattern = {0, 100, 1000, 300, 200, 100, 500, 200, 100}; 

// The '-1' here means to vibrate once, as '-1' is out of bounds in the pattern array 
v.vibrate(pattern, -1);