android.os.BinderProxy là gì

Chào mọi người em có một intent khi em đọc dữ liệu của nó kết quả:

android.media.projection.extra.EXTRA_MEDIA_PROJECTION : android.os.BinderProxy@85ac31d

android.media.projection.extra.EXTRA_MEDIA_PROJECTION : là nhãn còn android.os.BinderProxy@85ac31d là gì nhỉ. Cảm ơn mọi người đã xem

Do activity của bạn đang bind đến 1 service ko cùng process nên system return lại 1 instance của BinderProxy thôi, dãy số phía dau là id của nó thôi.

3 Likes

cái này có thể được lưu lại trong sharedPreferences dùng để gọi lại service sau khi điện thoại khởi động lại không ạ

Service có cách config riêng để auto start khi device restart ko cần dùng Sharedreference, bạn đọc kỹ lại document đi, mà ko phải loại sẻvic nào cũng được phép start cùng system.

3 Likes

Tài liệu ở đâu ý anh em cũng tìm hiểu nhưng thấy một số người trên stackoverflow bảo bây giời họ vẫn chưa làm được. Loại service là mediaproject. Khi chạy em sẽ bắt đầu nó trong onActivityResult.
Em mới chỉ tìm hiểu về android được hai tháng có sai mong anh bỏ qua @@.

Tối qua type bằng đt nên lazy, giờ làm rõ những points sau:
1/ Ko có loại service nào gọi là “mediaproject” trong Android.
2/ Nói cho mình biết bạn đang cần làm gì thì mình có thể cho bạn biết chính xác nên dùng cái gì.

3 Likes

Bạn đang mắc 1 vấn đề đó là x-y problem, do bạn không có đủ kiến thức về Android do đó khi mô tả vấn đề sẽ rất khó hiểu và không đúng vấn đề thực sự. Vì vậy sẽ có những sáng kiến cũng như yêu cầu khá là vô lí do bạn nghĩ ra. Do đó giải pháp cho bạn là:

  1. Nêu yêu cầu ban đầu của bài toán mà không thông qua ý hiểu của bạn
  2. Tìm hiểu kĩ về các Android components cơ bản như: Activity, Service, Broadcast Receiver và Provider. Vai trò của chúng và phương thức liên lạc giữa các Android components.
6 Likes

Cái em dùng là cái này ạ. Tại em thấy khai báo phải ghi vậy android:foregroundServiceType="mediaProjection"> nên chắc gọi là vậy @@. Để bắt đầu service em phải gọi startActivityForResult trong Mainactivity

startActivityForResult(
            mProjectionManager.createScreenCaptureIntent(),
            REQUEST_CODE)

Nếu người dùng chập nhận yêu cầu resulcode=result_ok=-1 trả về trong:

override fun onActivityResult(
        requestCode: Int,
        resultCode: Int,
        data: Intent?
    ) {
        if (requestCode == REQUEST_CODE) {
            if (resultCode == Activity.RESULT_OK) {
                val intentx:Intent =ScreenCaptureService.getStartIntent(
                    this,
                    resultCode,
                    data)
                startForegroundService(intentx)

Loại này có thể bắt đầu tự động sau khi điện thoại reset được không ạ. Kể từ android 10 người dùng phải cấp quyền thủ công bằng tay(không có ô chọn “không hỏi lại”)mỗi lần gọi startActivityForResult với mediaprojection. startActivityForResult hình như cũng không dùng được trong BroadcastReceiver.

1 Like

Để tóm tắt cho bạn khỏi mất công tìm kiếm thì điều bạn đang muốn thực hiện k thể làm được. Một số lí do sau giải thích cho điều đó:

  • Privacy: serivce bạn yêu cầu là service dùng để quay màn hình, những nội dung trên màn hình sẽ được ghi lại, do đó cần sự đồng ý trực tiếp của user. Tránh được các app khác lợi dụng để theo dõi. Bạn sẽ không muốn việc mình xem pỏn bị ghi lại một cách âm thầm đâu :rofl: :rofl: :rofl:
  • Performance: quay màn hình là một tác vụ yêu cầu năng lực xử lí cao và tốn tài nguyên hệ thống. Do vậy không nên cho phép hoạt động bừa bãi được

Tiếp theo mình sẽ giải thích một số thắc mắc khác của bạn và vì sao nó không thể làm được trong Android.

Đối tượng trả về sau khi bind service chỉ là một proxy tới service thực tế. Nó như kiểu bạn ngồi nhà nhưng order trà sữa ở 1 quán khác thông qua mấy anh shipper vậy. Tất cả tương tác của bạn tới service đều là ra lệnh cho proxy, proxy sẽ forward tới service thực tế. Bạn không thể lưu lại đối tượng này vì kể cả có lưu được rồi khôi phục lại thì nó cũng đã mất liên kết tới service thực, nếu không có kết nối tới service thực thì cái vỏ proxy sẽ vô dụng

Đúng, startActivityForResult yêu cầu phải là 1 activity thì mới nhận được kết quả, thời gian sống của BroadcastReceiver chỉ tối đa 10s, không đủ để nhận kết quả từ 1 activity khác do kết quả có thể xuất hiện trong 1 khoảng thời gian không xác định

5 Likes

@@ chán quá chắc em tìm cách khác. Cám ơn anh nhiều nhá. <3

Cám ơn anh luôn nhá <3

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?