2011-05-12 142 views
0

我想缩短使用谷歌缩短api的网址,我试过我的运气找到谷歌上的东西可以帮助我,但我没有发现任何博客或在java/android的东西可以帮助我。如果有人有更好的资源,请给我建议。这里是我的代码如何使用谷歌缩短api创建缩短的网址

public class tinyurl extends Activity implements OnClickListener { 
EditText original; 
TextView txt; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Button btn = (Button) findViewById(R.id.Button01); 

    original = (EditText) findViewById(R.id.edittext); 
    txt = (TextView) findViewById(R.id.TextView03); 
    btn.setOnClickListener(this); 
} 



@Override 
public void onClick(View v) { 
    final String GOOGL_URL = "https://www.googleapis.com/urlshortener/v1/url?key=AIzaSyAau1E_WrYwMiTNqhK5hgH0tyWudyahbOI"; 
    String tinyUrl = null; 
    String original = "http://www.google.com/"; 
    HttpTransport transport = GoogleTransport.create(); 
    GoogleHeaders defaultHeaders = new GoogleHeaders(); 
    transport.defaultHeaders = defaultHeaders; 
    transport.defaultHeaders.put("Content-Type", "application/json"); 
    transport.addParser(new JsonHttpParser()); 
    HttpRequest request = transport.buildPostRequest(); 
    request.setUrl(GOOGL_URL); 
    GenericData data = new GenericData(); 
    // data.put("longUrl", "http://www.google.com/"); 
    data.put("longUrl", original); 
    JsonHttpContent content = new JsonHttpContent(); 

    content.data = data; 
    request.content = content; 

    HttpResponse response = null; 
    try { 
     response = request.execute(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     Log.d("eception occured", e.toString()); 
    } 
    Result result = null; 
    try { 
     result = response.parseAs(Result.class); 
     Log.d("TinyUrl", result.shortUrl.toString()); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

public class Result extends GenericJson { 

    public String shortUrl; 

} 

}

所有我面临强制关闭,由于这一行的时间。

response = request.execute(); 

有什么建议吗?

这是我的堆栈跟踪,如果它提供任何帮助。

05-12 23:48:55.033: ERROR/AndroidRuntime(455): FATAL EXCEPTION: main 
05-12 23:48:55.033: ERROR/AndroidRuntime(455): java.lang.ExceptionInInitializerError 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at com.google.api.client.json.JsonHttpContent.writeTo(JsonHttpContent.java:66) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at com.google.api.client.apache.ContentEntity.writeTo(ContentEntity.java:55) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at org.apache.http.impl.entity.EntitySerializer.serialize(EntitySerializer.java:97) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at org.apache.http.impl.AbstractHttpClientConnection.sendRequestEntity(AbstractHttpClientConnection.java:161) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at org.apache.http.impl.conn.AbstractClientConnAdapter.sendRequestEntity(AbstractClientConnAdapter.java:272) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:237) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:119) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:410) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at com.google.api.client.apache.ApacheHttpRequest.execute(ApacheHttpRequest.java:47) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:207) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at com.tinyurl.tinyurl.onClick(tinyurl.java:113) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at android.view.View.performClick(View.java:2408) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at android.view.View$PerformClick.run(View.java:8816) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at android.os.Handler.handleCallback(Handler.java:587) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at android.os.Handler.dispatchMessage(Handler.java:92) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at android.os.Looper.loop(Looper.java:123) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at java.lang.reflect.Method.invoke(Method.java:521) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at dalvik.system.NativeStart.main(Native Method) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455): Caused by: java.lang.NoClassDefFoundError: org.codehaus.jackson.JsonFactory 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  at com.google.api.client.json.Json.<clinit>(Json.java:56) 
05-12 23:48:55.033: ERROR/AndroidRuntime(455):  ... 25 more 
+0

粘贴到您的堆栈跟踪在这里,你有没有上网的权限在您的清单? – FoamyGuy 2011-05-12 21:34:42

+0

是的,我在我的清单中有互联网许可。 – PiyushMishra 2011-05-12 21:37:45

回答

1

在堆栈跟踪的底部,您有一个NoClassDefFoundError,这意味着您在类路径中缺少一些jar文件。

0

我遇到了API问题,所以我使用了web api。制作下面的课程,它工作正常。使用GoogleUrlShortener类(ShortUrlResponse类,它只是一个POJO解析JSON响应),只需更换您的API密钥有:

import com.google.gson.Gson; 
import com.google.gson.annotations.Expose; 

import java.io.*; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLEncoder; 

public class GoogleUrlShortener { 

    private static final String API_KEY = "YOUR KEY HERE"; 

    public String shorten(String longUrl) { 

     String urlString = "https://www.googleapis.com/urlshortener/v1/url?key="+API_KEY; 

     String charset = "UTF-8"; 
     OutputStream output = null;; 
     HttpURLConnection connection = null; 
     Gson gson = new Gson(); 
     BufferedReader reader = null; 
     String request="{\"longUrl\": \""+longUrl+"\"}"; 
     String responseString=""; 
     String shortUrl=longUrl; //for now 
     try{ 

      java.net.URL url = new java.net.URL(urlString); 

      connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoOutput(true); 
      connection.setDoInput(true); 
      connection.setRequestMethod("POST"); 
      connection.setRequestProperty("Content-Type", "application/json"); 
      connection.setRequestProperty("charset", "utf-8"); 

      output = connection.getOutputStream(); 
      output.write(request.getBytes(charset)); 

      String line; 
      reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
      StringBuffer sb = new StringBuffer(); 
      while ((line = reader.readLine()) != null) { 
       sb.append(line); 
      } 
      responseString = sb.toString(); 

      shortUrl = gson.fromJson(responseString, ShortUrlResponse.class).getId(); 

      reader.close(); 

      //connection. 

      int code = connection.getResponseCode(); 
      if (code != 200) 
      { 
       System.out.println("GoogleUrlShortener request failed: "+responseString); 
      } 


     }catch(Throwable ex) 
     { 
      System.out.println("GoogleUrlShortener Exception: cannot shorten url. Long url: "+longUrl+" , api response: "+responseString); 
      ex.printStackTrace(); 

     } 
     finally{ 
      try{ 
       output.close(); 
       reader.close(); 
       return shortUrl; 
      } 
      catch(Exception e) 
      { 
       System.out.println("error in closing connections. something is really wrong"); 
      } 
     } 
     return shortUrl; 
    } 

    public static void main(String[] args) { 
     GoogleUrlShortener shortener = new GoogleUrlShortener(); 
     //String returned = GoogleUrlShortener.shorten("www.cnn.com"); 
     String returned = shortener.shorten("http://edition.cnn.com/2015/07/28/middleeast/gallery/egpyt-suez-canal-then-now/index.html"); 
     System.out.println("Short url returned---"+returned); 

    } 



    public class ShortUrlResponse { 

     @Expose 
     private String kind; 
     @Expose 
     private String id; 
     @Expose 
     private String longUrl; 

     /** 
     * 
     * @return 
     * The kind 
     */ 
     public String getKind() { 
      return kind; 
     } 

     /** 
     * 
     * @param kind 
     * The kind 
     */ 
     public void setKind(String kind) { 
      this.kind = kind; 
     } 

     public ShortUrlResponse withKind(String kind) { 
      this.kind = kind; 
      return this; 
     } 

     /** 
     * 
     * @return 
     * The id 
     */ 
     public String getId() { 
      return id; 
     } 

     /** 
     * 
     * @param id 
     * The id 
     */ 
     public void setId(String id) { 
      this.id = id; 
     } 

     public ShortUrlResponse withId(String id) { 
      this.id = id; 
      return this; 
     } 

     /** 
     * 
     * @return 
     * The longUrl 
     */ 
     public String getLongUrl() { 
      return longUrl; 
     } 

     /** 
     * 
     * @param longUrl 
     * The longUrl 
     */ 
     public void setLongUrl(String longUrl) { 
      this.longUrl = longUrl; 
     } 

     public ShortUrlResponse withLongUrl(String longUrl) { 
      this.longUrl = longUrl; 
      return this; 
     } 

    } 

}