2012-11-28 21 views
22

Sử dụngLàm thế nào để bạn bao gồm ampersands trong URL để adb shell pm bắt đầu?

$ adb shell am start some://url 

Tôi có thể khởi chạy URL bằng trình quản lý hoạt động. Tuy nhiên, nếu tôi bao gồm nhiều thông số URL, tất cả trừ thông số đầu tiên sẽ bị loại bỏ.

Ví dụ:

$ adb shell am start http://www.example.com?param1=1&param2=2 

Returns:

$ Starting: Intent { act=android.intent.action.VIEW dat=http://www.example.com?param1=1 } 

và param2 biến mất như bất cứ điều gì sau khi một dấu bị bỏ qua. Tôi tự hỏi nếu có một số nhân vật mã hóa/thoát cho & rằng sẽ ngăn chặn điều này.

Trả lời

29

sử dụng thoát nhân vật \:

$ adb shell am start "http://www.example.com?param1=1\&param2=2" 
+8

Thật không may với các công cụ nền tảng phiên bản 21 có một lỗi nơi URL sẽ được cắt ngắn sau dấu và đầu tiên, ngay cả khi bạn thoát khỏi nó. Vui lòng xem vấn đề này https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=76026 – bumbobway

+3

Giải pháp thay thế là gửi: '$ adb shell am start" http://www.example.com?param1=1%26param2=2 "' –

1

Tôi đã đăng tải một workaround ở đây: https://code.google.com/p/android/issues/detail?id=76026

Vì vậy, đây là công thức có liên quan đến thiết bị đo đạc.
Đăng ký một BroadcastReceiver trong thiết bị đo đạc mà nghe com.example.action.VIEW hành động.

IntentFilter intentFilter = new IntentFilter("com.example.action.VIEW"); 
intentFilter.addDataScheme("myschema"); 
intentFilter.addCategory(Intent.CATEGORY_BROWSABLE); 
Context.registerReceiver(new MyBroadcastReceiver(), intentFilter); 

Thay thế ký tự bằng% 26 (sử dụng có thể thay thế bằng bất kỳ thứ gì bạn muốn) và gửi ý định com.example.action.VIEW.
Khi nhận BroadcastReceiver ý định chuyển đổi% 26 trở về dấu và và gửi một ý định mới với hành động mong muốn ứng dụng của bạn.

public final void onReceive(final Context context, final Intent intent) { 
    intent.setAction(Intent.ACTION_VIEW); 
    intent.setData(Uri.parse(intent.getDataString().replaceAll("%26", "&"))); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(intent); 
} 

Về cơ bản, nó hoạt động như một proxy BroadcastReceiver.

4

Các giải pháp chấp nhận không làm việc vì một lỗi trong các công cụ xây dựng android mà bạn có thể theo dõi ở đây: https://code.google.com/p/android/issues/detail?id=76026. Một cách giải quyết là dưới đây:

echo 'am broadcast -a com.android.vending.INSTALL_REFERRER -n <your package>/<broadcast-receiver> --es "referrer" "utm_source=test_source&utm_medium=test_medium&utm_term=test_term&utm_content=test_content&utm_campaign=test_name";exit'|adb shell 

Để tích hợp nó trong gradle bạn có thể sử dụng câu lệnh commandline

commandLine "bash","-c","echo ..." 
+0

Cảm ơn bạn vì điều đó! Đây là cách thích hợp để kiểm tra INSTALL_REFERRER phát sóng ngay bây giờ. – scana

2

Trích lệnh am...!
giống như sau nên làm việc (nếu nó không, hãy thử đúp báo giá):

adb shell 'am start http://www.example.com?param1=1&param2=2' 
Các vấn đề liên quan