Sana yayınlanmıştır bağlantıda verilen kodu kullanarak olacak:
// Declare Variables
int softkeyboard_height = 0;
boolean calculated_keyboard_height;
Instrumentation instrumentation;
// Initialize instrumentation sometime before starting the thread
instrumentation = new Instrumentation();
mainScreenView
senin alttan görünüm, sizin etkinliğin görünümüdür. m
(ACTION_DOWN) ve m1
(ACTION_UP), Instrumentation#sendPointerSync(MotionEvent)
kullanılarak gönderilen dokunma olaylarıdır.
java.lang.SecurityException: mantığı MotionEvent görüntülenmekte olduğunu klavye SecurityException
aşağıdaki neden olacaktır yere sevk olmasıdır başka bir uygulamaya enjekte
Yani, biz başlatmak INJECT_EVENTS izin gerektirir Ekranın alt kısmında ve döngünün her yinelemesinde (y
) azaltarak yolumuza devam edin. Belirli sayıda yineleme için bir SecurityException alırız (ki bunu yakalarız): Bu, MotionEvent'in klavyede gerçekleştiğini ima eder. an y
kadar küçük olur (ne zaman onun sadece klavyenin üstünde), biz döngünün patlak ve kullanma klavyenin yüksekliğini hesaplarız:
softkeyboard_height = mainScreenView.getHeight() - y;
Kodu:
Thread t = new Thread(){
public void run() {
int y = mainScreenView.getHeight()-2;
int x = 10;
int counter = 0;
int height = y;
while (true){
final MotionEvent m = MotionEvent.obtain(
SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),
MotionEvent.ACTION_DOWN,
x,
y,
1);
final MotionEvent m1 = MotionEvent.obtain(
SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(),
MotionEvent.ACTION_UP,
x,
y,
1);
boolean pointer_on_softkeyboard = false;
try {
instrumentation.sendPointerSync(m);
instrumentation.sendPointerSync(m1);
} catch (SecurityException e) {
pointer_on_softkeyboard = true;
}
if (!pointer_on_softkeyboard){
if (y == height){
if (counter++ < 100){
Thread.yield();
continue;
}
} else if (y > 0){
softkeyboard_height = mainScreenView.getHeight() - y;
Log.i("", "Soft Keyboard's height is: " + softkeyboard_height);
}
break;
}
y--;
}
if (softkeyboard_height > 0){
// it is calculated and saved in softkeyboard_height
} else {
calculated_keyboard_height = false;
}
}
};
t.start();
Instrumentation#sendPointerSync(MotionEvent)
:
İşaretçi olayını gönderme. Alıcının alıcının olay işleme sürecinden döndüğü bir noktada tamamlandıysa da, olaydan tepki olarak tamamen bitmiş olabilir - örneğin, ekran görüntüsünü güncellemesi gerekiyorsa, yine de bunu yapma işlemi.
Bu genel bir API mi? "INTERNAL_POINTER_META_STATE" ile ilgili dokümanları bulamıyorum. – rid
@rid Üzgünüm. "INTERNAL_POINTER_META_STATE" bir tam sayı sabiti. Sorunun amacı için, herhangi bir tamsayı değeri kullanmak işe yarayacaktır. Yukarıdaki kodu düzenledim. İşaret ettiğin için teşekkürler. – Vikram
Yine de, Android'in gelecekteki sürümlerinde kaybolma şansına sahip olmadan bu özelliği kullanmak güvenli midir? Bu her zaman 1'in aynı olması garantilidir? Resmi olarak Google tarafından herhangi bir yerde belgelenmiş mi? Gevrek kod üretme korkusu olmadan buna güvenebilir misiniz? – rid