Как поместить несколько активов в событие данных для разработки Android - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь создать приложение, которое отправляет файлы с моих Android Watch на мой Android Phone.

У меня проблема в том, что если я записываю и сохраняю несколько файлов и отправляю их все одновременно, я не получаю все файлы обратно на телефонную сторону. Я получаю только один файл.

Код для отправки файла выглядит следующим образом. Этот код реализован на стороне часов .:

public void sendData(View v){
    String fname = "_Activity.bin";
    int FileCounterCopy = FileCounter;
    if(mGoogleApiClient.isConnected()){
        for (int i = 0; i < FileCounterCopy ; i++){
            String FileName = String.valueOf(i) + fname;
            File dataFile = new File(Environment.getExternalStorageDirectory(), FileName);
            Log.i("Path", Environment.getExternalStorageDirectory().toString());
            Log.i("file", dataFile.toString());

            Asset dataAsset = createAssetfromBin(dataFile);
            sensorData = PutDataMapRequest.create(SENSOR_DATA_PATH);
            sensorData.getDataMap().putAsset("File", dataAsset);

            PutDataRequest request = sensorData.asPutDataRequest();
            Wearable.DataApi.putDataItem(mGoogleApiClient, request).setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
                @Override
                public void onResult(DataApi.DataItemResult dataItemResult) {
                    Log.e("SENDING IMAGE WAS SUCCESSFUL: ", String.valueOf(dataItemResult.getStatus().isSuccess()));
                }
            });
            boolean deleted = dataFile.delete();
            Log.i("Deleted", String.valueOf(deleted));
            FileCounter--;
        }
        mTextView.setText(String.valueOf(FileCounter));
        Return();

    }
    else {
        Log.d("Not", "Connecteddddddddd");
    }

}

Код для получения файлов выглядит следующим образом и реализован на стороне телефона.

@Override
public void onDataChanged(DataEventBuffer dataEvents) {
    Counter++;
    final List<DataEvent> events = FreezableUtils.freezeIterable(dataEvents);
    dataEvents.close();
    Log.e("List Size: ", String.valueOf(events.size()));
    for (DataEvent event : events) {
        if (event.getType() == DataEvent.TYPE_CHANGED) {
            Log.v("Data is changed", "========================");
            String path = event.getDataItem().getUri().getPath();
            if (SENSOR_DATA_PATH.equals(path)) {
                DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
                fileAsset = dataMapItem.getDataMap().getAsset("File");
                myRunnable = createRunnable();
                if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)
                    new Thread(myRunnable).start();
            }
        }
    }
    status.setText("Received" + " File_"+ String.valueOf(Counter) );
}

Прямо перед циклом for я проверяю размер события, и он показывает только размер 1, независимо от того, сколько файлов я сохраняю.

Я застрял на том, как реализовать это (т. Ч. Я использовал код с видео / онлайн-ресурсов YouTube, поэтому я не уверен на 100% в том, как работают некоторые API).

Заранее спасибо!

1 Ответ

0 голосов
/ 03 июля 2018

Вы помещаете все файлы в один и тот же путь, без различий между ними, поэтому каждый добавленный вами файл перезаписывает предыдущие. В этом отношении Data API во многом похож на файловую систему.

В вашем методе sendData вам нужен код примерно такой:

sensorData = PutDataMapRequest.create(SENSOR_DATA_PATH + '/' + dataFile.toString());

А затем в onDataChanged либо только проверьте префикс пути ...

if (path.startsWith(SENSOR_DATA_PATH)) {

... или, предпочтительно, укажите значение SENSOR_DATA_PATH в декларации манифеста как элемент android:pathPrefix в intent-filter вашего получателя данных. Затем вы можете полностью удалить проверку пути из вашего кода Java. Документы для этого здесь: https://developers.google.com/android/reference/com/google/android/gms/wearable/WearableListenerService

Еще одна вещь: это хорошая практика, когда вы удаляете такие вещи, как эти файлы, из Data API, когда вы их используете, чтобы они не занимали там места.

...