Lưu trữ dung lượng lớn USB trên (hoặc tắt) thông qua các lệnh adb


17

Bối cảnh: Tôi có một thiết bị Android dính USB (ví dụ RikoMagic) mà tôi chủ yếu chạy ở chế độ "không đầu". Trong số những thứ khác, tôi đã tìm ra cách tắt nó thông qua sự kết hợp của adb và lệnh "am" nội bộ:

adb shell am start -n android/com.android.server.ShutdownActivity

Bây giờ tôi đang cố gắng tìm ra cách bật và tắt hỗ trợ lưu trữ dung lượng lớn USB. Tôi đã có được khi cửa sổ hoạt động lưu trữ USB bật lên thông qua lệnh sau:

adb shell am start -n com.android.systemui/.usb.UsbStorageActivity

Thật không may, tôi đã không thể tìm ra cách gửi "ý định" tương đương đến thực sự "không đếm được" hoặc "không chia sẻ" âm lượng được chia sẻ (hoặc "gắn kết" hoặc "chia sẻ" cho vấn đề đó). Lệnh sau không làm gì cả:

adb shell am start -n com.android.systemui/.usb.UsbStorageActivity -a android.intent.action.MEDIA_UNSHARED file:///mnt/sdcard

Tôi đang làm gì sai? Câu thần chú để gắn kết / ngắt kết nối bộ nhớ trong của thiết bị Android là gì?

Lưu ý 1: Tôi biết có lệnh "mount" / "umount" rõ ràng của Linux. Tuy nhiên, chỉ cần gắn hoặc ngắt âm lượng sẽ không kích hoạt các chức năng hệ thống quan trọng, ví dụ, khởi động lại hoặc dừng các ứng dụng đã được chuyển sang thẻ SD. Dù sao thì "umount" có thể sẽ thất bại khi một ứng dụng trong thẻ SD vẫn hoạt động.

Lưu ý 2: Rõ ràng có lệnh "setprop" có thể bật / tắt hỗ trợ bộ lưu trữ lớn USB UNTIL cho lần khởi động lại tiếp theo. Một lần nữa, cách tiếp cận tất cả hoặc không có gì này không phải là điều tôi đang tìm kiếm mà là khả năng bật và tắt bộ lưu trữ dung lượng lớn USB trong một phiên duy nhất, như giao diện cảm ứng có thể thực hiện.

adb shell setprop sys.usb.config mass_storage

Một câu hỏi được nghiên cứu rất kỹ, ước gì tôi có thể nâng cao nó hai lần! Cảm ơn những nỗ lực của bạn và chia sẻ những lệnh hữu ích và đã làm việc! Gương mẫu :) Những ngón tay đan chéo ai đó có thể nghĩ ra mảnh còn thiếu, vì điều đó thực sự hữu ích!
Izzy

Câu trả lời:


9

Than ôi, UsbStorageActivitykhông sử dụng ý định kích hoạt và vô hiệu hóa bộ lưu trữ lớn USB, vì vậy không có cách nào để đạt được điều này bằng cách sử dụng am. Nó thay vào đó gọi các chức năng StorageManager.enableUsbMassStorage`StorageManager.disableUsbMassStoragethực hiện công việc của nó. Vì các chức năng này được ẩn trong khung, nên cũng không thể viết một ứng dụng để thực hiện việc này. Theo tôi biết, không có lệnh hiện có để làm điều này.

Có thể viết một ứng dụng cung cấp giao diện dòng lệnh và sử dụng dịch vụ hệ thống bị ràng buộc MountServiceđể gọi setUsbMassStorageEnabledchức năng của nó , nhưng điều đó sẽ lạc đề đối với trang web này.


1
Nhưng chính xác thì chuyện gì sẽ xảy ra khi tôi nhấn vào nút "Bật bộ nhớ USB"? Tại sao không thể đạt được hiệu quả của việc nhấn nút này ngay cả khi bạn cực kỳ viết một ứng dụng hoàn toàn mới? Sẽ không phải là một biến thể thông minh hơn của tiện ích "khỉ" có làm nên chuyện không?
Ẩn danh Howard

Tôi đã giải thích rằng trong câu trả lời của mình: nó gọi các chức năng mà tôi đã đề cập, lần lượt gọi vào một dịch vụ hệ thống và dịch vụ hệ thống thực hiện tất cả công việc. Để biết thêm chi tiết, bạn sẽ phải đọc nguồn. Bạn thậm chí không thể sử dụng monkeyđể nhấp vào nút, vì mã có một kiểm tra rõ ràng cho điều đó, để dừng các bài kiểm tra vô tình ngắt lưu trữ.
Dan Hulme

Bạn có thể thử servicecông cụ CLI có thể gọi các phương thức dịch vụ hệ thống.
Léo Lam

5


Tôi đã thử "StorageManager.enableUsbMassStorage" và "StorageManager.disableUsbMassStorage" để bật và tắt bộ lưu trữ lớn và các tác phẩm của nó.
Cảm ơn.

Đó là phương pháp riêng tư. Vì vậy, nếu bạn muốn sử dụng chúng, bạn nên làm điều đó bằng cách phản chiếu. Để có được Trình quản lý lưu trữ đó, bạn có thể sử dụng phương thức getSystemService (java.lang.String) có trong các hoạt động:

 StorageManager storage = (StorageManager)getApplicationContext().getSystemService(STORAGE_SERVICE);
 Method method = storage.getClass().getDeclaredMethod("enableUsbMassStorage");
 method.setAccessible(true); 
 Object r = method.invoke(storage);

Và để loại bỏ lưu trữ lớn:

StorageManager storage = (StorageManager) getApplicationContext().getSystemService(STORAGE_SERVICE);
Method method = storage.getClass().getDeclaredMethod("disbleUsbMassStorage");
method.setAccessible(true);
Object r = method.invoke(storage);

Amir Brand- Tôi đã thử sử dụng phương pháp này nhưng tôi không thể vô hiệu hóa bộ lưu trữ usb của mình. Có phải nó làm việc với bạn? nếu có, bạn có thể vui lòng giúp tôi không
Khanna

Chào Khanna Chắc chắn. Không vấn đề gì. Xin vui lòng gửi cho tôi mail đến netmir2002 @ gmail với vấn đề và tôi sẽ cố gắng tìm giải pháp.
Thương hiệu Amir
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.