美文网首页
传输资源

传输资源

作者: Daz_ye | 来源:发表于2016-11-01 16:55 被阅读0次

    以下内容翻译自android wear的官方教程,本人水平有限,如有错误欢迎指出
    home
    以下正文


    为了通过蓝牙发送大块的二进制数据,比如图片。你可以把Asset
    对象赋给data item 并将data item放入重复数据存储处(replicated data store)(前面章节介绍的,可以自动将数据在手表和手机之间分别同步存储一份数据)。

    Assets自动的缓存数据以防止数据因网络问题重发。一个常见的应用场景是,手机上下载了一张图片,然后把它压缩到在手表上显示的合适的大小,然后用asset把图片发送到手表上。下面的示例展示了这个应用场景。

    注意:尽管数据大小被限制为100KB,但assets仍然可以想传多大就传多大。但是,传输过大的资源在很多情况下会影响用户的体验,所以在传输大资源的时候先要确保你的app的表现是否良好。

    传输一个资源

    create...()方法创建一个Asset类,在这里我们把一个二进制图片转换成一个比特流然后调用 createFromBytes()
    方法来创建这个资源。

    private static Asset createAssetFromBitmap(Bitmap bitmap) {
        final ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream);
        return Asset.createFromBytes(byteStream.toByteArray());
    }
    

    当你有一个asset之后,用 DataMap
    PutDataRequest
    的 putAsset()方法将它赋给一个data item,然后把data item用 [putDataItem()
    ](http://developer.android.youdaxue.com/reference/com/google/android/gms/wearable/DataApi.html#putDataItem(com.google.android.gms.common.api.GoogleApiClient, com.google.android.gms.wearable.PutDataRequest))存放到data store。

    使用PutDataRequest

    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
    Asset asset = createAssetFromBitmap(bitmap);
    PutDataRequest request = PutDataRequest.create("/image");
    request.putAsset("profileImage", asset);
    Wearable.DataApi.putDataItem(mGoogleApiClient, request);
    

    使用PutDataMapRequest

    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
    Asset asset = createAssetFromBitmap(bitmap);
    PutDataMapRequest dataMap = PutDataMapRequest.create("/image");
    dataMap.getDataMap().putAsset("profileImage", asset);
    PutDataRequest request = dataMap.asPutDataRequest();
    PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi
            .putDataItem(mGoogleApiClient, request);
    

    接收assets

    当asset被建立完成,你可能希望在另一端读取这个asset,下面是通过实现回调来发现asset被改变并读取这个asset:

    @Override
    public void onDataChanged(DataEventBuffer dataEvents) {
      for (DataEvent event : dataEvents) {
        if (event.getType() == DataEvent.TYPE_CHANGED &&
            event.getDataItem().getUri().getPath().equals("/image")) {
          DataMapItem dataMapItem =DataMapItem.fromDataItem(event.getDataItem());
          Asset profileAsset = dataMapItem.getDataMap().getAsset("profileImage");
          Bitmap bitmap = loadBitmapFromAsset(profileAsset);
          // 对这个 bitmap做一些处理
        }
      }
    }
    
    public Bitmap loadBitmapFromAsset(Asset asset) {
        if (asset == null) {
            throw new IllegalArgumentException("Asset must be non-null");
        }
        ConnectionResult result =
               mGoogleApiClient.blockingConnect(TIMEOUT_MS, TimeUnit.MILLISECONDS);
        if (!result.isSuccess()) {
            return null;
        }
        // 将asset转换成文件描述符,并在准备完成前阻塞
        InputStream assetInputStream = Wearable.DataApi.getFdForAsset(
                mGoogleApiClient, asset).await().getInputStream();
                mGoogleApiClient.disconnect();
    
        if (assetInputStream == null) {
            Log.w(TAG, "Requested an unknown Asset.");
            return null;
        }
    
        // 将流解码成 bitmap
        return BitmapFactory.decodeStream(assetInputStream);
    }
    

    来自译者的话

    这一章内容比较简略,像mGoogleApiClient,以及"/image"这些内容在前面的章节已经说明过,奉上链接一份mGoogleApiClient,"/image"

    相关文章

      网友评论

          本文标题:传输资源

          本文链接:https://www.haomeiwen.com/subject/kcvmuttx.html