请不要将其标记为重复
你好 我正在创建一个Android应用,以从Google日历获取事件。我的设备没有Google Play服务,这是设备Philips 10bdl3051t / 02和Android版本4.4.4。 我已经通过App Auth从浏览器授权了用户,我已经获得了授权令牌并能够获取事件。该令牌在大约一小时内保持有效,然后需要刷新。 我正在使用以下代码刷新令牌。问题在于,有时它没有刷新的令牌并抛出此异常。
原因:libcore.io.ErrnoException:recvfrom失败:ECONNRESET(对等方重置连接)
原因:libcore.io.ErrnoException:sendto失败:EPIPE(管道损坏)
代码段以刷新令牌
private void checkGoogleCalendarRESTApiAuthToken() {
SharedPreferences settings = getSharedPreferences(PREFS_FILE, 0);
SharedPreferences.Editor editor = settings.edit();
// only refresh the token when it is about to expire
long timeDifference = settings.getLong("googleCalendarRESTApiAccessTokenExpiry", new Date().getTime()) - new Date().getTime();
Log.d("authtoken", " googleCalendarRESTApiAccessTokenExpiry : " + String.valueOf(settings.getLong("googleCalendarRESTApiAccessTokenExpiry" , new Date().getTime())));
Log.d("authtoken", " timeDifference: " + String.valueOf(timeDifference));
if (timeDifference < 20) {
Thread tokenRefreshTask = new Thread(){
@Override
public void run() {
Log.d("authtoken", " tokenRefreshTask: " );
mAuthState.performActionWithFreshTokens(new AuthorizationService(context), new AuthState.AuthStateAction() {
@Override
public void execute(@Nullable String accessToken, @Nullable String idToken, @Nullable AuthorizationException exception) {
Log.d("authtoken", " performActionWithFreshTokens: " );
editor.putString("googleCalendarRESTApiAccessToken", mAuthState.getAccessToken());
editor.putLong("googleCalendarRESTApiAccessTokenExpiry", mAuthState.getAccessTokenExpirationTime());
editor.apply();
HttpTransport transport = AndroidHttp.newCompatibleTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
GoogleCredential googleAccountCredential = new GoogleCredential().setAccessToken(mAuthState.getAccessToken());
GoogleService = new com.google.api.services.calendar.Calendar.Builder(transport,jsonFactory,googleAccountCredential).build();
Log.d("authtoken", " getNeedsTokenRefresh: " + String.valueOf(mAuthState.getNeedsTokenRefresh()));
Log.d("authtoken", " getAccessTokenExpirationTime: " + String.valueOf(mAuthState.getAccessTokenExpirationTime()));
Log.d("authtoken", " getAccessToken: " + String.valueOf(mAuthState.getAccessToken()));
Log.d("authtoken", " isAuthorized: " + String.valueOf(mAuthState.isAuthorized()));
Log.d("authtoken", " getLastTokenResponse: " + String.valueOf(mAuthState.getLastTokenResponse()));
Log.d("authtoken", " getRefreshToken: " + String.valueOf(mAuthState.getRefreshToken()));
Log.d("authtoken", " getLastAuthorizationResponse: " + String.valueOf(mAuthState.getLastAuthorizationResponse()));
}
});
}
};tokenRefreshTask.start();
}
}
此设备具有通过此代码控制的侧面LED,此代码每20秒运行一次,以使LED状态与日历事件保持同步。可能是这段代码造成了问题,如果发现任何问题,请提出修改建议。
// ledStripsColor = "#00FF00" for green
// ledStripsColor = "#FF0000" for red
// ledStripsMode = true
private void philipsLed(String ledStripsColor, boolean ledStripsMode) {
Thread testing = new Thread() {
@Override
public void run() {
Socket socket = null;
OutputStream writer = null;
int stripsColor = Color.parseColor(ledStripsColor);
int mode = 0;
if (ledStripsMode) {
mode = 1; // 1 > turn on & 0 > turn off
} else {
mode = 0;
}
// Message //
int messageSize = 9;
int monitorId = 1;
int groupId = 0;
int command = 243; // To control the LED Strip
int colorR = Color.red(stripsColor);
int colorG = Color.green(stripsColor);
int colorB = Color.blue(stripsColor);
int checkSum = 0;
List<Integer> list = new ArrayList<Integer>();
list.clear();
list.add(messageSize);
list.add(monitorId);
list.add(groupId);
list.add(command);
list.add(mode);
list.add(colorR);
list.add(colorG);
list.add(colorB);
for (int a = 0; a < 8; a++) {
checkSum = checkSum ^ list.get(a);
}
try {
// The server and the client is the same device so I used the loopback ip address.
String ipAddress = "127.0.0.1";
int portNo = 5000;
socket = new Socket(ipAddress, portNo);
socket.setKeepAlive( false );
writer = socket.getOutputStream();
writer.write((byte) messageSize);
writer.write((byte) monitorId);
writer.write((byte) groupId);
writer.write((byte) command);
writer.write((byte) mode);
writer.write((byte) colorR);
writer.write((byte) colorG);
writer.write((byte) colorB);
writer.write((byte) checkSum);
writer.flush();
writer.close();
socket.close();
// I have to run it multiple times as somehow it didn't change the colors of the LEDs at first time.
// No.2 //
socket = new Socket(ipAddress, portNo);
socket.setKeepAlive( false );
writer = socket.getOutputStream();
sleep(100);
writer.write((byte) messageSize);
writer.write((byte) monitorId);
writer.write((byte) groupId);
writer.write((byte) command);
writer.write((byte) mode);
writer.write((byte) colorR);
writer.write((byte) colorG);
writer.write((byte) colorB);
writer.write((byte) checkSum);
writer.flush();
writer.close();
socket.close();
// I have to run it multiple times as somehow it didn't change the colors of the LEDs at first time.
// No.3 //
socket = new Socket(ipAddress, portNo);
socket.setKeepAlive( false );
writer = socket.getOutputStream();
sleep(100);
writer.write((byte) messageSize);
writer.write((byte) monitorId);
writer.write((byte) groupId);
writer.write((byte) command);
writer.write((byte) mode);
writer.write((byte) colorR);
writer.write((byte) colorG);
writer.write((byte) colorB);
writer.write((byte) checkSum);
writer.flush();
writer.close();
socket.close();
Log.d("tag : ", "color send");
} catch (final Exception e) {
// TODO Auto-generated catch block
Log.d("tag : ", "exception : " + e.getMessage());
if (Toggle.toggle_Debug) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "exception : " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
e.printStackTrace();
}
}
};
testing.start();
}
谢谢