2016-01-16 7 views
0

Я создал приложение, которое должно получать данные из моего канала musicpeak. Сначала я просто использовал виджет веб-виджета, но я хочу пойти дальше и использовать apache java api для обработки данных самостоятельно.Приложение для Android - Невозможно запустить Activity ComponentInfo

В MainActivity я просто положить в коде:

Channel channel = new Channel(1234,"writeKey"); 
try { 
    Entry entry = channel.getLastChannelEntry(); 
} catch (UnirestException e) { 
    e.printStackTrace(); 
} catch (ThingSpeakException e) { 
    e.printStackTrace(); 
} 
    out.println("entry"); 

, но я получаю следующее сообщение об ошибке:

java.lang.RuntimeException: Unable to start activity ComponentInfo{de.babytemp.babytempapp2/de.babytemp.babytempapp2.MainActivity}: java.lang.IllegalArgumentException: Unknown pattern character 'X' 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
at android.app.ActivityThread.access$800(ActivityThread.java:151) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5254) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
               Caused by: java.lang.IllegalArgumentException: Unknown pattern character 'X' 
at java.text.SimpleDateFormat.validatePatternCharacter(SimpleDateFormat.java:314) 
at java.text.SimpleDateFormat.validatePattern(SimpleDateFormat.java:303) 
at java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:356) 
at com.google.gson.DefaultDateTypeAdapter.<init>(DefaultDateTypeAdapter.java:49) 
at com.google.gson.GsonBuilder.addTypeAdaptersForDate(GsonBuilder.java:555) 
at com.google.gson.GsonBuilder.create(GsonBuilder.java:543) 
at de.babytemp.babytempapp2.Channel.<init>(Channel.java:46) 
at de.babytemp.babytempapp2.MainActivity.onCreate(MainActivity.java:41) 
at android.app.Activity.performCreate(Activity.java:5990) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)  
at android.app.ActivityThread.access$800(ActivityThread.java:151)  
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)  
at android.os.Handler.dispatchMessage(Handler.java:102)  
at android.os.Looper.loop(Looper.java:135)  
at android.app.ActivityThread.main(ActivityThread.java:5254)  
at java.lang.reflect.Method.invoke(Native Method)  
at java.lang.reflect.Method.invoke(Method.java:372)  
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)  
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)  

Спасибо!

+0

Пожалуйста, скопируйте исходный канал класса кода. –

+0

см. Ниже :) –

ответ

0
package de.babytemp.babytempapp2; 

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.mashape.unirest.http.HttpResponse; 
import com.mashape.unirest.http.JsonNode; 
import com.mashape.unirest.http.Unirest; 
import com.mashape.unirest.http.exceptions.UnirestException; 
import com.mashape.unirest.request.GetRequest; 
import java.util.HashMap; 

public class Channel { 

private String APIURL = "http://api.thingspeak.com"; 
private static final String APIHEADER = "XXXXXXXXX"; 
private final Integer channelId; 
private String readAPIKey; 
private String writeAPIKey; 
private final Boolean isPublic; 
private final HashMap<String, Object> fields = new HashMap<>(); 
private final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create(); 

/** 
* Constructor for a public, read-only, Thingspeak channel. This type of 
* channel cannot be updated. 
* 
* @param channelId Channel Id. 
*/ 
public Channel(Integer channelId) { 
    this.isPublic = true; 
    this.channelId = channelId; 
} 

/** 
* Constructor for a public, writeable, Thingspeak channel. 
* 
* @param channelId Channel Id. 
* @param writeKey API Key for the channel. See 
* https://thingspeak.com/channels/<channelId>#apikeys 
*/ 
public Channel(Integer channelId, String writeKey) { 
    this.isPublic = true; 
    this.channelId = channelId; 
    this.writeAPIKey = writeKey; 
} 

/** 
* Constructor for a private, writeable, Thingspeak channel. 
* 
* @param channelId Channel Id. 
* @param writeKey Write API Key. See 
* https://thingspeak.com/channels/<channelId>#apikeys. 
* @param readKey Read API Key. See 
* https://thingspeak.com/channels/<channelId>#apikeys. 
*/ 
public Channel(Integer channelId, String writeKey, String readKey) { 
    this.channelId = channelId; 
    this.readAPIKey = readKey; 
    this.writeAPIKey = writeKey; 
    this.isPublic = false; 
} 

/** 
* Make GET requests to the Thingspeak API without additional feed 
* parameters. 
* 
* @param url The API url. 
* @return JSON string. 
* @throws UnirestException The request cannot be made. 
* @throws ThingSpeakException The request is invalid. 
*/ 
private String thingRequest(String url) throws UnirestException, ThingSpeakException { 
    GetRequest request = Unirest.get(url); 
    if (!this.isPublic) { 
     request.field("key", this.readAPIKey); 
    } 
    HttpResponse<JsonNode> response = request.asJson(); 
    if (response.getCode() != 200) { 
     throw new ThingSpeakException("Request failed with code " + response.getCode()); 
    } 
    return response.getBody().toString(); 
} 

/** 
* Make GET requests to the Thingspeak API with additional feed parameters. 
* 
* @param url The API url. 
* @param options Optional feed parameters. 
* @return JSON string. 
* @throws UnirestException The request cannot be made. 
* @throws ThingSpeakException The request is invalid. 
*/ 
private String thingRequest(String url, FeedParameters options) throws UnirestException, ThingSpeakException { 
    GetRequest request = Unirest.get(url); 
    if (!this.isPublic) { 
     request.field("key", this.readAPIKey); 
    } 
    request.fields(options.fields); 
    HttpResponse<JsonNode> response = request.asJson(); 
    if (response.getCode() != 200) { 
     throw new ThingSpeakException("Request failed with code " + response.getCode()); 
    } 
    return response.getBody().toString(); 
} 

/** 
* Use a server other than thingspeak.com. If you are hosting your own 
* Thingspeak server, set the url of the server here. The url of the public 
* Thingspeak server is http://api.thingspeak.com 
* 
* @param url eg. http://localhost, http://thingspeak.local:3000, etc. 
*/ 
public void setUrl(String url) { 
    this.APIURL = url; 
} 

/** 
* Update channel with new data. 
* 
* @param entry The new data to be posted. 
* @return The id of the new entry. 
* @throws UnirestException The request cannot be made. 
* @throws ThingSpeakException The request is invalid. 
*/ 
public Integer update(Entry entry) throws UnirestException, ThingSpeakException { 
    HttpResponse<String> response = Unirest.post(APIURL + "/update") 
      .header(APIHEADER, this.writeAPIKey) 
      .header("Connection", "close") 
      .fields(entry.getUpdateMap()) 
      .asString(); 
    if (response.getCode() != 200) { 
     throw new ThingSpeakException("Request failed with code " + response.getCode()); 
    } else if (response.getBody().equals("0")) { 
     throw new ThingSpeakException("Update failed."); 
    } 
    return Integer.parseInt(response.getBody()); 
} 

/** 
* Get a channel feed with default feed options. Does not include location or status info. Only fields that 
* have been named in the channel's settings (via the web) will be returned. 
* 
* @return Feed for this channel. 
* @throws UnirestException The request cannot be made. 
* @throws ThingSpeakException The request is invalid. 
*/ 
public Feed getChannelFeed() throws UnirestException, ThingSpeakException { 
    String url = APIURL + "/channels/" + this.channelId + "/feed.json"; 
    return gson.fromJson(thingRequest(url), Feed.class); 
} 

/** 
* Get a channel feed with additional feed options. Only fields that have been named in 
* the channel's settings (via the web) will be returned. 
* 
* @param options Additional feed parameters. 
* @return Feed for this channel. 
* @throws UnirestException The request cannot be made. 
* @throws ThingSpeakException The request is invalid. 
*/ 
public Feed getChannelFeed(FeedParameters options) throws UnirestException, ThingSpeakException { 
    String url = APIURL + "/channels/" + this.channelId + "/feed.json"; 
    return gson.fromJson(thingRequest(url, options), Feed.class); 
} 

/** 
* Get last entry in this channel with default feed options. This is a 
* faster alternative to getting a Channel Feed and then calling 
* {@link Feed#getChannelLastEntry()}. 
* 
* @return Entry. 
* @throws UnirestException The request cannot be made. 
* @throws ThingSpeakException The request is invalid. 
*/ 
public Entry getLastChannelEntry() throws UnirestException, ThingSpeakException { 
    String url = APIURL + "/channels/" + this.channelId + "/feed/last.json"; 
    return gson.fromJson(thingRequest(url), Entry.class); 
} 

/** 
* Get last entry in this channel with additional feed options. This is a 
* faster alternative to getting a Channel Feed and then calling 
* {@link Feed#getChannelLastEntry()} 
* 
* @param options 
* @return Entry. 
* @throws UnirestException The request cannot be made. 
* @throws ThingSpeakException The request is invalid. 
*/ 
public Entry getLastChannelEntry(FeedParameters options) throws UnirestException, ThingSpeakException { 
    String url = APIURL + "/channels/" + this.channelId + "/feed/last.json"; 
    return gson.fromJson(thingRequest(url, options), Entry.class); 
} 

/** 
* Get a field feed with default feed options. 
* 
* @param fieldId The field to include in the field (1-8). 
* @return Feed. 
* @throws UnirestException The request cannot be made. 
* @throws ThingSpeakException The request is invalid. 
*/ 
public Feed getFieldFeed(Integer fieldId) throws UnirestException, ThingSpeakException { 
    String url = APIURL + "/channels/" + this.channelId + "/field/" + fieldId + ".json"; 
    return gson.fromJson(thingRequest(url), Feed.class); 
} 

/** 
* Get a field feed with additional feed options. 
* 
* @param fieldId The field to include in the field (1-8). 
* @param options Optional parameters that control the format of the feed. 
* @return Feed. 
* @throws UnirestException The request cannot be made. 
* @throws ThingSpeakException The request is invalid. 
*/ 
public Feed getFieldFeed(Integer fieldId, FeedParameters options) throws UnirestException, ThingSpeakException { 
    String url = APIURL + "/channels/" + this.channelId + "/field/" + fieldId + ".json"; 
    return gson.fromJson(thingRequest(url, options), Feed.class); 
} 

/** 
* Get the last entry in a field feed with default feed options. 
* 
* @param fieldId The field to return (0-8). 
* @return Last entry for the specified field. 
* @throws UnirestException The request cannot be made. 
* @throws ThingSpeakException The request is invalid. 
*/ 
public Entry getLastFieldEntry(Integer fieldId) throws UnirestException, ThingSpeakException { 
    String url = APIURL + "/channels/" + this.channelId + "/field/" + fieldId + "/last.json"; 
    return gson.fromJson(thingRequest(url), Entry.class); 
} 

/** 
* Get the last entry in a field feed with additional feed options.  
* 
* @param fieldId The field to return (0-8). 
* @param options Supported options: offset, status, and location. 
* @return Last entry for the specified field. 
* @throws UnirestException The request cannot be made. 
* @throws ThingSpeakException The request is invalid. 
*/ 
public Entry getLastFieldEntry(Integer fieldId, FeedParameters options) throws UnirestException, ThingSpeakException { 
    String url = APIURL + "/channels/" + this.channelId + "/field/" + fieldId + "/last.json"; 
    return gson.fromJson(thingRequest(url, options), Entry.class); 
} 

/** 
* Get channel status updates. Uses the default feed options. 
* 
* @return Status feed. 
* @throws UnirestException The request cannot be made. 
* @throws ThingSpeakException The request is invalid. 
*/ 
public Feed getStatusFeed() throws UnirestException, ThingSpeakException { 
    String url = APIURL + "/channels/" + this.channelId + "/status.json"; 
    return gson.fromJson(thingRequest(url), Feed.class); 
} 

/** 
* Get channel status updates. 
* 
* @param options Only {@link FeedParameters#offset(java.lang.Integer)} is 
* supported. 
* @return Status feed. 
* @throws UnirestException The request cannot be made. 
* @throws ThingSpeakException The request is invalid. 
*/ 
public Feed getStatusFeed(FeedParameters options) throws UnirestException, ThingSpeakException { 
    String url = APIURL + "/channels/" + this.channelId + "/status.json"; 
    return gson.fromJson(thingRequest(url, options), Feed.class); 
} 

}

0

Пожалуйста, попробуйте

private final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create(); 

в

private final Gson gson = new GsonBuilder().setDateFormat(java.text.DateFormat.LONG).create() 
+0

сделано, но у меня есть новая ошибка –

0
FATAL EXCEPTION: main 
              Process: de.babytemp.babytempapp2, PID: 8731 
              java.lang.NoSuchFieldError: No static field INSTANCE of type Lorg/apache/http/message/BasicLineFormatter; in class Lorg/apache/http/message/BasicLineFormatter; or its superclasses (declaration of 'org.apache.http.message.BasicLineFormatter' appears in /system/framework/ext.jar) 
               at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52) 
               at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:56) 
               at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<clinit>(DefaultHttpRequestWriterFactory.java:46) 
               at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:72) 
               at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:84) 
               at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<clinit>(ManagedHttpClientConnectionFactory.java:59) 
               at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.<init>(PoolingHttpClientConnectionManager.java:487) 
               at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:147) 
               at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:136) 
               at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:112) 
               at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:727) 
               at com.mashape.unirest.http.options.Options.refresh(Options.java:41) 
               at com.mashape.unirest.http.options.Options.<clinit>(Options.java:27) 
               at com.mashape.unirest.http.HttpClientHelper.prepareRequest(HttpClientHelper.java:142) 
               at com.mashape.unirest.http.HttpClientHelper.request(HttpClientHelper.java:119) 
               at com.mashape.unirest.request.BaseRequest.asString(BaseRequest.java:52) 
               at de.babytemp.babytempapp2.Channel.update(Channel.java:149) 
               at de.babytemp.babytempapp2.MainActivity.onCreate(MainActivity.java:47) 
               at android.app.Activity.performCreate(Activity.java:5990) 
               at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
               at android.app.ActivityThread.access$800(ActivityThread.java:151) 
               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
               at android.os.Handler.dispatchMessage(Handler.java:102) 
               at android.os.Looper.loop(Looper.java:135) 
               at android.app.ActivityThread.main(ActivityThread.java:5254) 
               at java.lang.reflect.Method.invoke(Native Method) 
               at java.lang.reflect.Method.invoke(Method.java:372) 
               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
Смежные вопросы