我正在尝试将我的Google服装中的文件发送到我的Nexus 5.我已经阅读了一些教程,并提出了以下代码,但我的手机没有收到文件。
移动:
private GoogleApiClient mGoogleApiClient;
private int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
Log.d(TAG, "CONNECTING:");
mGoogleApiClient.connect();
}
@Override
protected void onResume() {
super.onStart();
}
@Override
public void onConnected(Bundle bundle) {
Log.d(TAG, "CONNECTED");
Toast.makeText(getApplicationContext(), "Connected.",
Toast.LENGTH_LONG).show();
Wearable.DataApi.addListener(mGoogleApiClient, this);
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
protected void onPause() {
super.onPause();
Wearable.DataApi.removeListener(mGoogleApiClient, this);
mGoogleApiClient.disconnect();
}
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
Toast.makeText(getApplicationContext(), "Data changed.",
Toast.LENGTH_LONG).show();
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("sensordataAsset");
Log.d(TAG, "");
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 storage = getApplicationContext().getFilesDir();
Log.d(TAG, "Location:" + storage.toString());
File dir = new File(storage.getAbsolutePath() + "/Clockwork/");
if (!dir.exists()) {
dir.mkdirs();
} // Create folder if needed
Log.d(TAG, dir.getAbsolutePath());
// Read data from the Asset and write it to a file on external storage
final File file = new File(dir, "sensordata.txt");
if (!file.exists()) {
file.mkdirs();
}
Log.d(TAG, file.getPath());
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) {
}
}
}
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
}
磨损:
public void sendTextFile() {
readFromFile();
FileInputStream fileInputStream = null;
byte[] bFile = new byte[(int) file.length()];
try {
fileInputStream = new FileInputStream(file);
fileInputStream.read(bFile);
fileInputStream.close();
} catch (Exception e) {
Log.e(TAG, "sendTextFile: " + e.toString());
}
connectGoogleApi();
//Create an Asset from the byte array and set it via the DataApi
Asset asset = Asset.createFromBytes(bFile);
PutDataMapRequest dataMap = PutDataMapRequest.create("/txt");
dataMap.getDataMap().putAsset("sensordataAsset", asset);
PutDataRequest request = dataMap.asPutDataRequest();
PendingResult<DataApi.DataItemResult> pendingResult = Wearable.DataApi
.putDataItem(mGoogleApiClient, request);
}
private void connectGoogleApi() {
mGoogleApiClient = new GoogleApiClient.Builder(context)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
mGoogleApiClient.connect();
}
@Override
public void onConnected(Bundle bundle) {
Log.d(TAG, "CONNECTED");
Toast.makeText(context, "Connected.",
Toast.LENGTH_LONG).show();
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
}
我用上面列出的方法制作了一个记录器。有人能告诉我我做错了什么。提前谢谢。
答案 0 :(得分:0)
在数据图中添加一个键值: map.put(&#34; timestamp&#34;,System.currentmillions()) 您的手机没有收到任何更改事件,因为您将相同的数据项放入数据api队列,尝试放入不同的项目
答案 1 :(得分:0)
我通过替换
解决了这个问题PutDataRequest putDataRequest = PutDataRequest.create("/image");
putDataRequest.putAsset("debugFile", asset);
Wearable.DataApi.putDataItem(client, putDataRequest);
用这个
PutDataMapRequest dataMap = PutDataMapRequest.create("/image");
dataMap.getDataMap().putAsset("debugFile", asset);
PutDataRequest request = dataMap.asPutDataRequest();
PendingResult<DataItemResult> pendingResult = Wearable.DataApi.putDataItem(client, request);
pendingResult.setResultCallback(new ResultCallback<DataItemResult> () {
@Override
public void onResult(DataItemResult dataItemResult) {
// something
}
} );
现在它对我有用
答案 2 :(得分:0)
主要错误:
// Read data from the Asset and write it to a file on external storage
final File file = new File(dir, "sensordata.txt");
if (!file.exists()) {
file.mkdirs(); <---- you create a directory instead a file
}
这就是为什么你看不到错误的原因。
fOut.flush();
fOut.close();
} catch (Exception e) { <--- hide exception
}
文件作为目录存在,流不能打开
FileOutputStream fOut = new FileOutputStream(file); <-- throw exception