1

私はAndroidに比較的慣れていません。Android Wear デバイスから電話にファイルを転送していますPutDataRequest。電話側では、DataItemAssetを使用してファイル記述子を提供できるを取得しますWearable.DataApi.getFdForAsset()。私の質問は、このファイルを外部ストレージに保存するにはどうすればよいですか?

ありがとうございました!

4

1 に答える 1

4

Android Wear ウォッチからペアリングされた携帯電話にテキスト ファイルをアップロードする方法を次に示します。もっと簡単な方法があるかもしれませんが、これが私にとってうまくいった方法です。

(1) ウォッチ側で、テキスト ファイルを作成し、それを DataApi を介して配置できるアセットに読み込みます。

public void SendTextFile()
{
    // Get folder for output
    File sdcard = Environment.getExternalStorageDirectory();
    File dir = new File(sdcard.getAbsolutePath()+ "/MyAppFolder/");
    if (!dir.exists()) {dir.mkdirs();} // Create folder if needed
    final File file = new File(dir, "test.txt");
    if (file.exists()) file.delete();

    // Write a text file to external storage on the watch
    try {
        Date now = new Date();
        long nTime = now.getTime();
        FileOutputStream fOut = new FileOutputStream(file);
        PrintStream ps = new PrintStream(fOut);
        ps.println("Time = "+Long.toString(nTime)); // A value that changes each time
        ps.close();
    } catch (Exception e) {
    }

    // Read the text file into a byte array
    FileInputStream fileInputStream = null;
    byte[] bFile = new byte[(int) file.length()];
    try {
        fileInputStream = new FileInputStream(file);
        fileInputStream.read(bFile);
        fileInputStream.close();
    } catch (Exception e) {
    }

    // Create an Asset from the byte array, and send it via the DataApi
    Asset asset = Asset.createFromBytes(bFile);
    PutDataMapRequest dataMap = PutDataMapRequest.create("/txt");
    dataMap.getDataMap().putAsset("com.example.company.key.TXT", asset);
    PutDataRequest request = dataMap.asPutDataRequest();
    PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi
            .putDataItem(mGoogleApiClient, request);
}

(2) モバイル側で、アセットを受け取り、それをファイルに書き戻します。

public void onDataChanged(DataEventBuffer dataEvents) {
    for (DataEvent event : dataEvents) {
        if (event.getType() == DataEvent.TYPE_CHANGED &&
                event.getDataItem().getUri().getPath().equals("/txt"))
        {
            // Get the Asset object
            DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
            Asset asset = dataMapItem.getDataMap().getAsset("com.example.company.key.TXT");

            ConnectionResult result =
                    mGoogleApiClient.blockingConnect(10000, TimeUnit.MILLISECONDS);
            if (!result.isSuccess()) {return;}

            // Convert asset into a file descriptor and block until it's ready
            InputStream assetInputStream = Wearable.DataApi.getFdForAsset(
                    mGoogleApiClient, asset).await().getInputStream();
            mGoogleApiClient.disconnect();
            if (assetInputStream == null) { return; }

            // Get folder for output
            File sdcard = Environment.getExternalStorageDirectory();
            File dir = new File(sdcard.getAbsolutePath() + "/MyAppFolder/");
            if (!dir.exists()) { dir.mkdirs(); } // Create folder if needed

            // Read data from the Asset and write it to a file on external storage
            final File file = new File(dir, "test.txt");
            try {
                FileOutputStream fOut = new FileOutputStream(file);
            int nRead;
            byte[] data = new byte[16384];
                while ((nRead = assetInputStream.read(data, 0, data.length)) != -1) {
                    fOut.write(data, 0, nRead);
                }

                fOut.flush();
                fOut.close();
            }
            catch (Exception e)
            {
            }

            // Rescan folder to make it appear
            try {
                String[] paths = new String[1];
                paths[0] = file.getAbsolutePath();
                MediaScannerConnection.scanFile(this, paths, null, null);
            } catch (Exception e) {
            }
        }
    }
}

外部ストレージに書き込むには、両端のマニフェストに次のアクセス許可を追加する必要もあります: android.permission.WRITE_EXTERNAL_STORAGE

注: 最も気をつけなければならないことは、データが変更されない場合、転送が行われないことです。そのため、同じデータ ファイルの内容を 2 回書き込むかどうかをテストする場合、最初の実行でファイルを削除したとしても、最初にしか発生しません。DataApi のこの陰湿な機能にかなりの時間を費やしました。そのため、上記のコードは現在の時刻をテキスト ファイルに書き込んでいます。

また、もちろん、ここで説明されているように、接続、リスナーの追加などのために GoogleApiClient オブジェクトを設定していることを確認してください: http://developer.android.com/training/wearables/data-layer/index.html

于 2015-02-05T23:30:15.663 に答える