我有一个带登录的Android应用程序 在尝试失败后,我试图阻止登录x分钟。 如果用户尝试超过y次我想与系统时间进行比较,x分钟后用户可以登录我如何实现新的android请帮帮我
lgn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
uname = user.getText().toString();
pass = passwrd.getText().toString();
if (isConnectingToInternet()) {
if ((passwrd.equals() == "username") || (user.equlas() == "password")) {
Toast ->success
}
if(count >=4){
// this part i dont know how to
//i want to block 30 minute if user tried x attemts,
lgnbutton->disble
}
}
}
}
答案 0 :(得分:0)
您可以使用android的CountDownTimer类,而不是使用系统的时间来计算x分钟。
https://developer.android.com/reference/android/os/CountDownTimer.html
尝试失败后,您可以使用btn.setEnabled(true)
停用按钮,在计数器完成后,您可以使用onTick
启用该按钮。
如果要显示剩余时间再次启用该按钮,您还可以使用CountDownTimer类(onTick
)的方法。
CountDownTimer()
将在new CountDownTimer(<total_time>, <interval>) {
public void onTick(long millisUntilFinished) {
//update time left
}
public void onFinish() {
//enable button
}
}.start();
中作为参数提及的每个时间间隔后调用BitmapRenderer
。
例如,
private static class BitmapRenderer implements GLSurfaceView.Renderer {
private int[] textures;
private Resources resources;
public BitmapRenderer(Resources resources) {
this.resources = resources;
}
private static final float[] VERTEX_COORDINATES = new float[] {
-1.0f, +1.0f, 0.0f,
+1.0f, +1.0f, 0.0f,
-1.0f, -1.0f, 0.0f,
+1.0f, -1.0f, 0.0f
};
private static final float[] TEXTURE_COORDINATES = new float[] {
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f
};
private static final Buffer TEXCOORD_BUFFER = ByteBuffer.allocateDirect(TEXTURE_COORDINATES.length * 4)
.order(ByteOrder.nativeOrder()).asFloatBuffer().put(TEXTURE_COORDINATES).rewind();
private static final Buffer VERTEX_BUFFER = ByteBuffer.allocateDirect(VERTEX_COORDINATES.length * 4)
.order(ByteOrder.nativeOrder()).asFloatBuffer().put(VERTEX_COORDINATES).rewind();
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
textures = new int[1];
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glGenTextures(1, textures, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher), 0);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
}
@Override
public void onDrawFrame(GL10 gl) {
gl.glActiveTexture(GL10.GL_TEXTURE0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, VERTEX_BUFFER);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, TEXCOORD_BUFFER);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
}
}
答案 1 :(得分:0)
import android.content.Context;
import android.content.SharedPreferences;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import java.io.IOException;
public class LogInActivity extends AppCompatActivity {
private Button logInButton;
private SharedPreferences prefs;
private long timeLeft;
private CountDownTimer timer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_log_in);
initTasks();
checkTimer();
}
private void initTasks() {
logInButton = (Button) findViewById(R.id.bt);
prefs = getSharedPreferences("file", Context.MODE_PRIVATE);
}
private void checkTimer() {
if (prefs.contains("time"))
setTimer();
else {
SharedPreferences.Editor editor = prefs.edit();
editor.putLong("time", -1L);
editor.apply();
}
}
private void setTimer() {
timeLeft = prefs.getLong("time", -1L);
if (timeLeft != -1L)
startTimer(timeLeft);
else
logInButton.setEnabled(true);
}
private void startTimer(long time) {
logInButton.setEnabled(false);
timer = new CountDownTimer(time, 1000) {
@Override
public void onFinish() {
logInButton.setEnabled(true);
saveToPref(-1L);
}
@Override
public void onTick(long millisUntilFinished) {
//update UI, if required
timeLeft = millisUntilFinished;
saveToPref(timeLeft);
}
};
}
private void saveToPref(long timeLeft){
SharedPreferences.Editor editor = prefs.edit();
editor.putLong("time", timeLeft);
editor.apply();
}
}
所有尝试失败时 call startTimer(<your_time>)
。 <your_time>
是您希望按钮保持禁用状态的时间。它是以毫秒为单位。
我没有测试过代码,因此可能会出现问题。这是满足您要求的基本思路。
答案 2 :(得分:0)
时间计数器仅在应用程序运行时有效。在这种情况下,我将以更难的方式计算时间。首先获取以毫秒为单位的当前时间将它们写入共享首选项,并在应用程序再次启动时从首选项中获取写入的毫秒数并计算剩余的倒计时间隔。我的提议是:
// get saved time if it exist. Do it on app start or activity create
Long defaultTime = null;
SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
Long writtenTime = null;
try {
writtenTime = sharedPreferences.getLong("timer", defaultTime);
} catch (ClassCastException e) {}
// DO THIS ONLY WHEN BUTTON IS DISABLED
// count how much time left for countdown
Long current = Calendar.getInstance().getTime().getTime();
long interval = (writtenTime == null)? 30000L : current - writtenTime;
// save new current time
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putLong("timer", current);
editor.apply();
// countdown and enable button on finish
new CountDownTimer(current+interval, interval) {
public void onTick(long millisUntilFinished) {}
public void onFinish() {
btn.setEnabled(true);
}
}.start();