2017-09-25 28 views
0

백그라운드에서 작동해야하는 지문 인식 응용 프로그램을 개발 중이며 계속해서 원하는 작업을 수행하기 위해 사용자의 지문 입력을 계속 수신합니다. 지금까지 IntentService를 사용하여 백그라운드에서 지문 스캐너를 작동 시키려고했지만 액티비티를 닫거나 최소화하면 지문 스캐너가 작동을 멈 춥니 다. 내 활동이 종료 된 후에도 백그라운드에서 지문 스캐너를 사용할 수있는 방법이 있습니까? 다음은 코드 아래에이 시도 할 수백그라운드에서 안드로이드 장치의 지문을 계속 수신합니다.

public class AsyncService extends IntentService { 

    private int ONGOING_NOTIFICATION_ID=2346712; 

    public AsyncService() { 
     super(AsyncService.class.getName()); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     showNotification(); 
     new FingerprintHandler().startAuth(Provider.fpManager,Provider.cryptoObj); 
    } 

    public void showNotification() { 

     Intent notificationIntent = new Intent(this, MainActivity.class); 
     PendingIntent pendingIntent = 
       PendingIntent.getActivity(this, 0, notificationIntent, 0); 

     Notification notification = 
       new Notification.Builder(this) 
         .setContentTitle(getText(R.string.notification_title)) 
         .setContentText(getText(R.string.notification_message)) 
         .setSmallIcon(R.drawable.launcher) 
         .setContentIntent(pendingIntent) 
         .build(); 

     startForeground(ONGOING_NOTIFICATION_ID, notification); 
    } 

    public class FingerprintHandler extends FingerprintManager.AuthenticationCallback { 

     private CancellationSignal cancellationSignal; 
     public void startAuth(FingerprintManager manager, FingerprintManager.CryptoObject cryptoObject) 
     { 
      cancellationSignal = new CancellationSignal(); 
      if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) 
      { 
       return; 
      } 
      manager.authenticate(cryptoObject, cancellationSignal, 0, this, null); 
     } 

     @Override 
     public void onAuthenticationError(int errMsgId, CharSequence errString) 
     { 

     } 

     @Override 
     public void onAuthenticationFailed() 
     { 
      //some action to perform 
     } 

     @Override 
     public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) 
     { 

     } 

     @Override 
     public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) 
     { 
      //some action to perform 
     } 
    } 
} 

Provider.java

public class Provider { 

    public static FingerprintManager fpManager; 
    public static FingerprintManager.CryptoObject cryptoObj; 
    public static Context mContext; 

    public Provider(FingerprintManager fingerprintManager, FingerprintManager.CryptoObject cryptoObject, Context context) { 
     fpManager=fingerprintManager; 
     cryptoObj=cryptoObject; 
     mContext=context; 
    } 
} 

답변

0

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    private static final String KEY_NAME = "secretkey"; 
    private Cipher cipher; 
    private KeyStore keyStore; 
    private KeyGenerator keyGenerator; 
    private FingerprintManager.CryptoObject cryptoObject; 

    private TextView textView; 
    private Button auth_button,stop_button; 
    private FingerprintManager fingerprintManager; 
    private KeyguardManager keyguardManager; 

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

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); 
      fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE); 
      textView=(TextView)findViewById(R.id.authStatus); 
      auth_button=(Button)findViewById(R.id.auth_button); 
      stop_button=(Button)findViewById(R.id.stop_button); 

      if (!fingerprintManager.isHardwareDetected()) { 
       textView.setText("Your device doesn't support fingerprint authentication"); 
      } 

      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { 
       textView.setText("Please enable the fingerprint permission"); 
      } 

      if (!fingerprintManager.hasEnrolledFingerprints()) { 
       textView.setText("No fingerprint configured. Please register at least one fingerprint in your device's Settings"); 
      } 

      if (!keyguardManager.isKeyguardSecure()) { 
       textView.setText("Please enable lockscreen security in your device's Settings"); 
      } 

      else { 
       auth_button.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         Toast.makeText(MainActivity.this, "Starting service", Toast.LENGTH_SHORT).show(); 
         try 
         { 
          generateKey(); 
         } 
         catch(Exception e) 
         { 
          e.printStackTrace(); 
         } 
         if(initCipher()) 
         { 
          Provider provider=new Provider(fingerprintManager,cryptoObject,MainActivity.this); 
          Intent intent=new Intent(MainActivity.this,AsyncService.class); 
          startService(intent); 
         } 
        } 
       }); 

       stop_button.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         stopService(new Intent(MainActivity.this,AsyncService.class)); 
         Toast.makeText(MainActivity.this, "Service stopped", Toast.LENGTH_SHORT).show(); 
        } 
       }); 
      } 
     } 
    } 

    private void generateKey() { 
     try 
     { 
      keyStore = KeyStore.getInstance("AndroidKeyStore"); 
      keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); 
      keyStore.load(null); 
      keyGenerator.init(new 

        KeyGenParameterSpec.Builder(KEY_NAME, 
        KeyProperties.PURPOSE_ENCRYPT | 
          KeyProperties.PURPOSE_DECRYPT) 
        .setBlockModes(KeyProperties.BLOCK_MODE_CBC) 
        .setUserAuthenticationRequired(true) 
        .setEncryptionPaddings(
          KeyProperties.ENCRYPTION_PADDING_PKCS7) 
        .build()); 

      keyGenerator.generateKey(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public boolean initCipher() { 
     try 
     { 
      cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7); 
     } 
     catch (Exception e) 
     { 
      throw new RuntimeException("Failed to get Cipher", e); 
     } 

     try 
     { 
      keyStore.load(null); 
      SecretKey key = (SecretKey) keyStore.getKey(KEY_NAME, null); 
      cipher.init(Cipher.ENCRYPT_MODE, key); 
      return true; 
     } 
     catch (KeyPermanentlyInvalidatedException e) 
     { 
      return false; 
     } 
     catch (Exception e) 
     { 
      throw new RuntimeException("Failed to init Cipher", e); 
     } 
    } 
} 

AsyncService.java 내 코드입니다. 당신이 매니페스트 파일에

<service 
     android:name=".service.Service" 
     android:enabled="true" 
     android:icon="@drawable/ic_launcher" 
     android:isolatedProcess="true"> 

    </service> 

을 서비스의 속성을 추가 또한 서비스에 START_STICKY를 추가 할 필요가 우선.

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    return START_STICKY; 
}