Soru & Cevap

Sensörlü Kilit Uygulaması

28.04.2014 - 04:56

Merhabalar. Telefonu cebinize koyduğunuzda tuşların otomatik kilitlenmesi için bir uygulama geliştiriyorum. Uygulama "Yakınlık (Proximity) Sensörü"nü kullanıyor. Sensörde değişiklik algılandığında "mDevicePolicyManager.lockNow();" komutu çalıştırılarak titreşim ile tuşların kilitlendiğine dair bir geri bildirim veriliyor. Sorularım ise:

  • 1. Uygulama sadece kilitleme yapabiliyor. Unlock ile ilgili kayda değer bir sonuç bulamadım. Sensörün önü açıldığında ekranı geri açması için ne yapabilirim?
  • 2. Tuşlar kilitlendikten sonra her sensör değişikliğinde titreşim alıyorum. Bu da ekran kilitli olsa dahi uygulamanın ekranı tekrar kilitlediğini gösteriyor. Bu durumu nasıl düzeltebilirim?

MainActivity.java

[code]

package com.example.cepkilden;

import com.example.cepkilden.R;

import android.app.Activity;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Vibrator;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {

    private static final int ADMIN_INTENT = 15;
    private static final String description = "Ekranı kilitleyebilmek için yetkilendirin";
    private DevicePolicyManager mDevicePolicyManager; 
    private ComponentName mComponentName;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mDevicePolicyManager = (DevicePolicyManager)getSystemService(  
            Context.DEVICE_POLICY_SERVICE);  
    mComponentName = new ComponentName(MainActivity.this, MyAdminReceiver.class);  
    Button btnEnableAdmin = (Button) findViewById(R.id.btnEnable);
    Button btnDisableAdmin = (Button) findViewById(R.id.btnDisable);
    btnEnableAdmin.setOnClickListener(MainActivity.this);
    btnDisableAdmin.setOnClickListener(MainActivity.this);
    sensorBilgisi = (TextView)findViewById(R.id.textView1);
    sensorBilgisi.setText("Sensor bilgisi alınıyor..");
    sensorYoneticisi = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
    yakinSensoru = sensorYoneticisi.getDefaultSensor(Sensor.TYPE_PROXIMITY);
    sensorYoneticisi.registerListener(sensorDinleyicisi,yakinSensoru,
    SensorManager.SENSOR_DELAY_FASTEST);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btnEnable:
        Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
        intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mComponentName);
        intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,description);
        startActivityForResult(intent, ADMIN_INTENT);
        break;

    case R.id.btnDisable:
        mDevicePolicyManager.removeActiveAdmin(mComponentName);  
        Toast.makeText(getApplicationContext(), "Admin registration removed", Toast.LENGTH_SHORT).show();
        break;
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == ADMIN_INTENT) {
        if (resultCode == RESULT_OK) {
            Toast.makeText(getApplicationContext(), "Yönetici olarak kaydedildi", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(getApplicationContext(), "Yönetici olarak kaydedilemedi", Toast.LENGTH_SHORT).show();
        }
    }
}

SensorManager sensorYoneticisi;
Sensor yakinSensoru;
TextView sensorBilgisi;
SensorEventListener sensorDinleyicisi = new SensorEventListener(){

@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
}

@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_PROXIMITY){
sensorBilgisi.setText("Yakınlık:"+ String.valueOf(event.values[0]));
if (String.valueOf(event.values[0])=="0.0")
{
    boolean isAdmin = mDevicePolicyManager.isAdminActive(mComponentName);  
    if (isAdmin) {  
        mDevicePolicyManager.lockNow(); 
        Vibrator vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        vib.vibrate(200);}
    else{
        Toast.makeText(getApplicationContext(), "Yönetici olarak kayıtlı değil", Toast.LENGTH_SHORT).show();}
}
        
}    
}
};
}

[/code]

MyAdminReceiver.java

[code]

package com.example.cepkilden;

import android.app.admin.DeviceAdminReceiver;

public class MyAdminReceiver extends DeviceAdminReceiver{

}

[/code]

activity_main.xml

[code]

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="56dp"
        android:layout_marginTop="36dp"
        android:text="@string/textView1" />

    <Button
        android:id="@+id/btnEnable"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="22dp"
        android:text="Enable" />

    <Button
        android:id="@+id/btnDisable"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/btnEnable"
        android:layout_below="@+id/btnEnable"
        android:text="Disable" />

</RelativeLayout>

[/code]

AndroidManifest.xml

[code]

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.cepkilden"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="19" />
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
    <uses-permission android:name="android.permission.WAKE_LOCK"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.cepkilden.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <receiver
            android:name="MyAdminReceiver"
            android:permission="android.permission.BIND_DEVICE_ADMIN" >
            <meta-data
                android:name="android.app.device_admin"
                android:resource="@xml/admin" />

            <intent-filter>
                <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
            </intent-filter>
        </receiver>
        
    </application>

</manifest>

[/code]

75 Görüntülenme

4 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-20467-1455707757.jpg
byyasin
28.04.2014 - 09:35

Ekran kapandığında tüm sensör dinlemeleride kapanıyor. Ha cihazı ayık tutup ekranı kapatabilir bunu başarabilirsin fakat buda kullanıcının şarjını içeceği için kimse bu uygulamayı kullanmaz.

Barış Onat
29.04.2014 - 03:07
Ekran kapandığında sensör hala dinlemede oluyor. Söz konusu yakınlık sensörü olduğundan telefonun şarjını saat bazında bile etkileyeceğini sanmam. Ama benim sıkıntım ekran kapalıyken titremesi, sadece açıksa; kapanırken titresin.
Profile picture for user AyakPompasi
AyakPompasi
28.04.2014 - 03:34
Profile picture for user demirqan
demirqan
28.04.2014 - 12:21

uygulamayi proje olarak paylasirsan musait zamanda bakabilirim.

ekranin acilmasi icin, voltaj geliyor olmasi lazim. biraz karisik orasi. bazi telefonlar ekran isigi kapatinca voltaji da kapatiyor.

 

picture-3049-1487867786.jpg
hozirik
28.04.2014 - 10:48

Merhabalar,

Ekran kilidini açtırmak konusunda ne yapabileceğinizi bilmiyorum. Bunun için herhangi bir kod olduğunu zannetmiyorum, zira ekran kilidini açtırmamanız sizin için de daha iyi olacaktır diye düşünüyorum.

 

Ekran kilitliyken sensörün çalışması konusuna gelince;

Uygulama içine bir broadcast reciever koyarak ekranın açık mı kapalı mı olduğu yayınını algılayarak bir değişken üzerinden sensörün çalışmasını sağlayabilirsiniz.

Yardımcı olabilecek link: http://stackoverflow.com/questions/9477922/android-broadcast-receiver-for-screen-on-and-screen-off

Barış Onat
28.04.2014 - 03:19
Ekran kilidini açamam muhtemelen de kilit ekranını göstermek istiyorum.
Arda Volkan Gürsel
29.04.2014 - 06:06
Anlıyorum, dediğim gibi kilit ekranını nasıl göstereceğinizi bilmiyorum ama ekranın kapandığını broadcastreciever sayesinde kontrol edebilirsiniz. Broadcastreciever kullanımı için Android 401 dersine bakabilirsiniz, orada nasıl kullanabileceğiniz anlatılıyor.