Отправить строку json на эмулятор | устройство через командную строку adb shell в Android

#android #shell #command-line #adb

#Android #оболочка #командная строка #adb

Вопрос:

Я работаю с adb shell командной строкой для обмена данными между Android Studio и Emulator .

Я начал Activity с Bundle extras (напр. Строка, Int …), которую я отправляю из adb командной строки, все в порядке.

 adb shell am start -W -a android.intent.action.VIEW -d "sheme://host/pathPrefix" --es extra_video "videoKey=xxx"
  

Теперь я пытаюсь сделать то же самое, но с другой Bundle extras (JSON string),

Затем я не могу получить правильный ВЫВОД ЖУРНАЛА с JSON string форматом.

Я не уверен, что я точно заполнил командную строку.

 adb shell am start -W -a android.intent.action.VIEW -d "sheme://host/pathPrefix" 
--es extra_video "{"name":"abc","place":"xyz"}"
// LOG OUTPUT : data = Bundle[{extra_recommendation_video=name:abc}]

adb shell am start -W -a android.intent.action.VIEW -d "sheme://host/pathPrefix" 
--es extra_video "{"name":"abc","place":"xyz"}"
// LOG OUTPUT : data = Bundle[{extra_recommendation_video=name:abc}]

adb shell am start -W -a android.intent.action.VIEW -d "sheme://host/pathPrefix" 
--es extra_video "{'name':'abc','place':'xyz'}"
// LOG OUTPUT : data = Bundle[{extra_recommendation_video=name:abc}]
  

Я хочу получить вывод, такой же, как и ввод. (Правильный ВЫВОД ЖУРНАЛА: data = Bundle[{extra_recommendation_video={"name":"abc","place":"xyz"}] )

Люди, которые знают правильный JSON string формат заполнения командной строки, пожалуйста, сообщите мне,

Спасибо,

введите описание изображения здесь

p / s: Приведенные ниже коды точны, проблема заключается только в input использовании командной строки.

Manifest.xml

 <activity
        android:name=".MainActivity"
        android:launchMode="singleInstance">

        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.BROWSABLE" />
            <category android:name="android.intent.category.DEFAULT" />

            <!--scheme://host/pathPrefix-->
            <data
                android:host="host"
                android:pathPrefix="/pathPrefix"
                android:scheme="scheme" />

        </intent-filter>

    </activity>
  

MainActivity.java

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(contentView);

    if (getIntent() != null) {
        Video video = null;

            if (getIntent().getExtras() != null) {
                String data = getIntent().getExtras().getString(EXTRA_VIDEO);

                // LOG OUTPUT HERE IS WRONG FORMAT, NOT IS JSON STRING FORMAT
                Log.d(LogcatConstants.LIFE_CYCLE, " data = "   data); 

                video = TVApp.GSON.fromJson(data, Video.class);
            }

        if (video != null) {
            Intent i = new Intent(this, VideoActivity.class);
            i.putExtra(VideoPlayerActivity.EXTRA_VIDEO, gson.toJson(video));
            startActivity(i);
        }
    }

}
  

Ответ №1:

Следующее сработало для меня в примере BroadcastReceiver (должно сработать и для вас):

     adb shell am broadcast -n com.example.myapp/com.example.myapp.MyReceiver -a com.example.TEST_ACTION --es extra_video "{field1: value1, field2:123}"
  

Таким образом, в основном, только пробелы и запятые, похоже, требуют экранирования. Возможно, также использует апострофирование.
Код BroadcastReceiver:

 
    public class MyReceiver extends BroadcastReceiver {
        public static final String TAG = "MEOW33";

        public static final String EXTRA_KEY_VIDEO = "extra_video";

        @Override
        public void onReceive(Context context, Intent intent) {

            if (null == intent)
                return;

            Log.d(TAG, "MyReceiver: onReceive: action - " intent.getAction());

            if (!intent.hasExtra(EXTRA_KEY_VIDEO)) {
                Log.w(TAG, "MyReceiver: onReceive: NO EXTRA, abort");
                return;
            }

            String jsonStr = intent.getStringExtra(EXTRA_KEY_VIDEO);
            Log.d(TAG, "MyReceiver: onReceive: jsonStr - " jsonStr);
            try {
                JSONObject json = new JSONObject(jsonStr);
                Log.d(TAG, "MyReceiver: onReceive: json object created - " json);
            }
            catch (JSONException je){
                Log.e(TAG, "MyReceiver: onReceive: SHAME ON YOU! exception: " je.getMessage());
            }

        }
    }

  

Вывод Logcat:

 D/MEOW33: MyReceiver: onReceive: действие - com.example.TEST_ACTION
 D/MEOW33: MyReceiver: onReceive: jsonStr - {field1: value1, field2:123}
 D/MEOW33: MyReceiver: onReceive: создан объект json - {"field1": "value1", "field2":123}