2012-09-19 32 views
9

Ứng dụng của tôi có thông tin người dùng nhạy cảm và chúng tôi cần triển khai màn hình mật mã để hiển thị bất cứ khi nào người dùng mở ứng dụng. Dưới đây là hai phương pháp tôi đã thử sau khi đọc this post.Thực hiện Khóa mật khẩu cho ứng dụng Android

  1. Sử dụng một biến tĩnh và đặt lại nó trong onStop() của từng hoạt động và kiểm tra xem nó một lần nữa trong onStart() của từng hoạt động và hiển thị màn hình mật mã nếu thời gian vượt qua mức tối thiểu ngưỡng nói 1-2 giây. Vấn đề với cách tiếp cận này là ứng dụng của tôi cũng sử dụng ý định để gọi máy quét mã vạch và máy ảnh và người dùng có thể mất nhiều thời gian hơn trong các ứng dụng bên ngoài này. Tôi có thể tăng ngưỡng trong trường hợp này nhưng nó làm cho các phép tính phức tạp và không phải là một giải pháp rất tốt.

  2. Tôi đã thử cách tiếp cận khác bằng cách sử dụng phương pháp này.

    protected boolean isAppOnForeground(final Context context) { 
    List<RunningAppProcessInfo> appProcesses = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getRunningAppProcesses(); 
    
        if (appProcesses == null) { 
         return false; 
        } 
    
        final String packageName = context.getPackageName(); 
    
        for (RunningAppProcessInfo appProcess : appProcesses) { 
         if ((appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) && 
          appProcess.processName.equals(packageName)) { 
          return true; 
         } 
        } 
        return false; 
    } 
    

Nhưng điều này sẽ luôn luôn trở thành sự thật khi tôi kiểm tra nó trong phương thức onStart của từng hoạt động kể từ khi quá trình đã bắt đầu vào thời điểm đó là trong onStart

Có bất kỳ phương pháp khác mà Tôi có thể thực hiện để hiển thị mật mã khi người dùng mở ứng dụng? Nó sẽ được hiển thị ngay cả khi người dùng nhấp vào màn hình chính để thoát khỏi ứng dụng và sau đó quay lại ứng dụng từ các ứng dụng gần đây.

+0

không chắc chắn, nhưng nếu u có thể thực hiện dịch vụ và mọi người nói 1 hoặc 2 giây gọi isapponforeground và thay đổi biến thành true/false và trong hoạt động tiếp tục, chỉ cần kiểm tra/false – Amit

+0

cho số 1, cái gì về chuỗi loại một phiên SỬ DỤNG/cookie được mã hóa được lưu trữ trong SharedPreference * private * - bạn có thể đặt thời gian chờ trong vài phút và điều này có thể cho phép người dùng rời khỏi và quay lại ứng dụng của bạn. – pjco

+0

một giải pháp khác có thể trở thành quản trị viên thiết bị để sử dụng khóa thiết bị thay vì khóa pin ứng dụng tùy chỉnh. điều này có thể tốt hơn hoặc tệ hơn tùy thuộc vào cách bạn nhìn vào nó. nếu bạn có nhiều ứng dụng yêu cầu bảo mật, đó là một khóa duy nhất cho tất cả các ứng dụng. nếu bạn chỉ có một ứng dụng, người dùng sẽ cảm thấy khó chịu vì ứng dụng của bạn đang buộc họ phải có màn hình khóa. –

Trả lời

4

Tôi đã triển khai tính năng chính xác này. về cơ bản tôi đã làm # 1 của bạn, nhưng theo một cách rõ ràng hơn.

những gì tôi đã làm là viết một lớp con trừu tượng là Activity và ghi đè onResume(). trong đó, quyết định xem bạn có cần hiển thị màn hình khóa pin không. nếu bạn làm vậy, hãy tự hoàn thành và bắt đầu hoạt động khóa pin. có tất cả các hoạt động của bạn mở rộng hoạt động này.

để nhớ vị trí của bạn, bạn có thể thêm mục đích "bắt đầu" vào mục đích được sử dụng để bắt đầu hoạt động khóa pin. khi ứng dụng được mở khóa, hoạt động khóa pin có thể sử dụng thêm để đặt người dùng quay lại đúng vị trí của họ.

nếu ứng dụng của bạn dựa trên phân đoạn, điều này sẽ đơn giản. bất cứ khi nào hoạt động lưu trữ tất cả các mảnh vỡ được tiếp tục, bạn sẽ hiển thị đoạn khóa pin. đó là tất cả.

sự cố với ứng dụng bao gồm một loạt các hoạt động là không có khoảnh khắc xác định rõ ràng nào về "bắt đầu" ứng dụng. khái niệm này không tồn tại. đây thực chất là vấn đề bạn tìm thấy với giải pháp # 1 của mình. onResume() có vẻ như là một lựa chọn tốt nhưng có thể được gọi vì nhiều lý do. ví dụ, người dùng bắt đầu hoạt động A, bắt đầu hoạt động B. bây giờ họ nhấn lại. hiển thị khóa pin, hay không?

bất kỳ giải pháp nào sử dụng chuỗi kiểm tra các quy trình tiền cảnh là một ý tưởng tồi tệ vì tác động của pin.

cuối cùng, bạn có thể muốn đặt câu hỏi về yêu cầu có khóa mã pin mỗi khi ứng dụng được đưa vào nền trước. có vẻ như quá nhiều nếu tôi bị trả lại để đọc tin nhắn văn bản và quay lại 10 giây sau đó, tôi buộc phải nhập lại một ghim. thời gian dựa trên dường như thích hợp hơn.

+0

Sự khác biệt duy nhất với 'onResume()' vs 'onStart()' là 'onResume()' có thể được gọi sau khi một hộp thoại đã đóng. Đó có thể là một lợi thế hay bất lợi mà tôi đoán. – pjco

+0

@pjco tôi nghĩ rằng 'onStart/Stop()' có lẽ là lựa chọn tốt hơn cho lý do bạn đã xác định. –

+0

@ Jeff: Cảm ơn bạn. Tôi đã thực sự làm một BaseActivity từ đó hầu như tất cả các hoạt động của tôi được phân lớp và tôi thực hiện kiểm tra mật mã trong các phương thức onStart và onStop. Tôi không quan tâm đến điều đó khi người dùng mở hộp thoại như họ đã có trong ứng dụng. Tôi hoàn toàn đồng ý về điều tác động của pin và tôi chắc chắn sẽ không thực hiện phương pháp tiếp cận dịch vụ nền cho chỉ kiểm tra này. Và liên quan đến việc yêu cầu mật mã, có, nó rất quan trọng đối với ứng dụng của tôi. Người dùng thực sự yêu cầu nó và đưa ra phản hồi tiêu cực vì tôi không có nó. Tất nhiên tôi sẽ làm cho nó tùy chọn cho những người muốn nó. – achie

Các vấn đề liên quan