2010-12-06 2 views
3

저는 애플리케이션을 작성하는 초심자이며 학교 프로젝트에 참여하고 있습니다. 이제 방금 프로그램 디버깅을 마쳤습니다. 버튼을 클릭 할 때 메소드를 호출하는 것과 관련 될 수없는 주요 문제가 있습니다. 이 프로그램은 사용자가 검색어를 입력 한 후 파일을 다운로드하기위한 것입니다.Android : 치명적인 예외 문제 : 버튼 클릭으로 메소드를 호출하려고 시도합니다.

원래 logcat은 HelloTabWidget 클래스에서 메서드를 찾을 수 없다는 메시지를 표시했습니다. 원래 SearchActivity 클래스에서 findSong 메서드를 사용했기 때문에 SearchActivity에서 HelloTabWidget으로 모든 코드를 옮겼습니다. 어쨌든 모든 것을 볼 수있는 쉬운 방법 인 것 같았습니다. 자, 여기에 XML에서 onClick 경로를 변경 팁을 시도했지만 그 중 하나를 해결하지 않았다. 오히려 이전 오류가 있습니다. "com.android.iPirate.HelloTabWidget.findSong 메서드를 HelloTabWidget 활동에서 찾을 수 없습니다 ..."메서드에서 추가 된 예외와 관련이 있다고 생각하기 시작했습니다. 하지만이 문제를 해결하기 위해 할 수있는 일은 사실상 거의 알려지지 않았습니다. 어떤 도움을 주시면 감사하겠습니다. 여기

는 HelloTabWidget입니다 :

package com.android.iPirate; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.HashSet; 
import java.util.Scanner; 
import java.util.Set; 

>import android.app.Activity; 
import android.app.TabActivity; 
import android.content.Intent; 
import android.content.res.Resources; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TabHost; 
import android.widget.TextView; 


public class HelloTabWidget extends TabActivity { 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Resources res = getResources(); // Resource object to get Drawables 
     TabHost tabHost = getTabHost(); // The activity TabHost 
     TabHost.TabSpec spec; // Reusable TabSpec for each tab 
     Intent intent; // Reusable Intent for each tab 

     // Create an Intent to launch an Activity for the tab (to be reused) 
     intent = new Intent().setClass(this, SearchActivity.class); 

     // Initialize a TabSpec for each tab and add it to the TabHost 


     // Do the same for the other tabs 

     intent = new Intent().setClass(this, SongsActivity.class); 
     spec = tabHost.newTabSpec("songs").setIndicator("Songs", 
          res.getDrawable(R.drawable.ic_tab_artists)) 
         .setContent(intent); 
     tabHost.addTab(spec); 

     intent = new Intent().setClass(this, SettingsActivity.class); 
     spec = tabHost.newTabSpec("settings").setIndicator("Instructions", 
          res.getDrawable(R.drawable.ic_tab_settings)) 
         .setContent(intent); 
     tabHost.addTab(spec); 

     tabHost.setCurrentTab(2); } 

    public String searchTerm; 
    public String quotes = ""; 
    public String title; 
    public EditText edittext; 
    public String youTubeURL; 
    public Set<String> names = new HashSet<String>(); 


     public void findSong(View view) throws Exception { 
      edittext = (EditText) findViewById(R.id.edittext); 
      searchTerm = edittext.getText().toString(); 
      String address; 
      address = getURL(searchTerm); 
      UrlDownload.fileUrl(address, title + ".mp3", "/"); 
     } 

     public void findPlaylist(View view) throws Exception{ 
      findSong(view); 
      String[] pageNames = getLinks(youTubeURL); 
      for(String name : pageNames) 
       if (!names.contains(name)) 
        UrlDownload.fileUrl(getURL(name), title + ".mp3", "/"); 
     } 

     public static String[] getLinks(String link) throws Exception { 
      URL url = new URL(link); 
      BufferedReader in = new BufferedReader(
        new InputStreamReader(
        url.openStream())); 
      Scanner input = new Scanner(in); 
      String[] songs = new String[15]; 
      for(int i = 0; i < 15; i++) 
       songs[i] = nextTitle(input); 
      return songs; 
     } 

     public static String nextTitle(Scanner input){ 
      while (input.hasNextLine()){ 
       String inputLine = input.nextLine(); 
       if (inputLine.contains("<span dir=\"ltr\" class=\"title\" title=\"")){ 
        return inputLine.substring 
        (inputLine.indexOf("<span dir=\"ltr\" class=\"title\" title=\"") + 37, inputLine.indexOf(">")-1); 
       } 
      } 
      return null; 
     } 

     public String getURL(String searchString) throws Exception { 
      String searchQuery = searchString.replace(' ','+'); 
      String siteURL = new String("http://www.youtube.com/results?search_query="+searchQuery+ "&aq=f\""); 
      URL url; 
      url = new URL(siteURL); 
      BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
      Scanner input = new Scanner(in); 
      String videoLink = ""; 
      String fLink = null; 
      while(input.hasNextLine()){ 
       String line = input.nextLine(); 
       if(line.contains("<!-- start search results -->")){ 
        for(int i = 0; i <= 44; i++){ 
         line = input.nextLine(); 
        } 
        youTubeURL = "www.youtube.com/"+line.substring(line.indexOf("<a href=")+8, line.indexOf("class")-2); 
        videoLink = "http://www.video2mp3.net/index.php?url=" + youTubeURL; 
        title = line.substring(line.indexOf("title="+6),line.indexOf(quotes,line.indexOf("title")+7)-1); 
        names.add(title); 
        break; 
       } 
      } 
      URL vurl = null; 
      vurl = new URL(videoLink); 
      BufferedReader in2; 
      in2 = new BufferedReader(new InputStreamReader(vurl.openStream())); 
      Scanner input2 = new Scanner(in2); 
      while(input2.hasNextLine()){ 
       String line = input.nextLine(); 
       if(line.contains("Conversion successfully completed!")){ 
        line = input.nextLine(); 
        line = input.nextLine(); 
        fLink = line.substring(line.indexOf("http"),line.indexOf("/'")); 
        break; 
       } 
      } 
      URL furl; 
      furl = new URL(fLink); 
      BufferedReader in3 = new BufferedReader(new InputStreamReader(furl.openStream())); 
      Scanner input3 = new Scanner(in3); 
      while(input3.hasNextLine()){ 
       String line = input.nextLine(); 
       if(line.contains("Wait 20 seconds or click here")){ 
        line = input.nextLine(); 
        String line2 = input.nextLine(); 
        String line3 = input.nextLine(); 
        String line4 = input.nextLine(); 
        if(line2.contains(".mp3")) 
         return line.substring(line.indexOf("tt"+3)) + line2.substring(0,line2.indexOf(".mp3")+4); 
        else if(line3.contains(".mp3")) 
         return line.substring(line.indexOf("tt"+3)) + line2 + line3.substring(0,line3.indexOf(".mp3")+4); 
        else if(line4.contains(".mp3")){ 
         return line.substring(line.indexOf("tt"+3)) + line2 + line3 + line4.substring(0,line4.indexOf(".mp3")+4); 
        } 
       } 
      } 
      return ""; 
     } 

     public void savemp3(String s) throws Exception{ 
      URLConnection conn = new URL(s).openConnection(); 
      InputStream is = conn.getInputStream(); 

      OutputStream outstream = new FileOutputStream(new File(title + ".mp3")); 
      byte[] buffer = new byte[4096]; 
      int len; 
      while ((len = is.read(buffer)) > 0) { 
       outstream.write(buffer, 0, len); 
      } 
      outstream.close(); 
     } 
    } 

이제 XML :

<?xml version="1.0" encoding="utf-8"?> 
<TabHost xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/tabhost" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:padding="5dp"> 
     <EditText 
     android:id="@+id/edittext" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"/> 
     <Button 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:text="Find Song" 
     android:onClick="findSong" /> 
     <Button 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:text="Find Playlist" 
     android:onClick="findPlaylist" /> 

     <TabWidget 
      android:id="@android:id/tabs" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 
     <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:padding="5dp"/> 




    </LinearLayout> 
</TabHost> 

매니페스트 :

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.android.iPirate" 
    android:versionCode="1" 
    android:versionName="1.0"> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".HelloTabWidget" 
       android:label="@string/app_name" 
       android:theme="@android:style/Theme.NoTitleBar"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    <activity android:name=".SettingsActivity" 
       android:label="@string/app_name" 
       android:theme="@android:style/Theme.NoTitleBar"> 
     </activity> 
    <activity android:name=".SearchActivity" 
       android:label="@string/app_name" 
       android:theme="@android:style/Theme.NoTitleBar"> 
     </activity> 
      <activity android:name=".SongsActivity" 
       android:label="@string/app_name" 
       android:theme="@android:style/Theme.NoTitleBar"> 
     </activity> 
    </application> 
    <uses-sdk android:minSdkVersion="8" /> 

</manifest> 

과 로그 캣 :

12-06 14:35:33.603: ERROR/AndroidRuntime(4157): FATAL EXCEPTION: main 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157): java.lang.IllegalStateException: Could not execute method of the activity 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at android.view.View$1.onClick(View.java:2072) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at android.view.View.performClick(View.java:2408) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at android.view.View$PerformClick.run(View.java:8816) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at android.os.Handler.handleCallback(Handler.java:587) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at android.os.Handler.dispatchMessage(Handler.java:92) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at android.os.Looper.loop(Looper.java:123) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at java.lang.reflect.Method.invoke(Method.java:521) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at dalvik.system.NativeStart.main(Native Method) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157): Caused by: java.lang.reflect.InvocationTargetException 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at com.android.iPirate.HelloTabWidget.findSong(HelloTabWidget.java:71) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at java.lang.reflect.Method.invoke(Method.java:521) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at android.view.View$1.onClick(View.java:2067) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  ... 11 more 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157): Caused by: java.net.SocketException: Permission denied 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at org.apache.harmony.luni.platform.OSNetworkSystem.createStreamSocketImpl(Native Method) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at org.apache.harmony.luni.platform.OSNetworkSystem.createStreamSocket(OSNetworkSystem.java:186) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at org.apache.harmony.luni.net.PlainSocketImpl.create(PlainSocketImpl.java:265) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at java.net.Socket.checkClosedAndCreate(Socket.java:873) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at java.net.Socket.connect(Socket.java:1020) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:62) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:88) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHTTPConnection(HttpURLConnectionImpl.java:927) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:909) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:1152) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at java.net.URL.openStream(URL.java:653) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  at com.android.iPirate.HelloTabWidget.getURL(HelloTabWidget.java:111) 
12-06 14:35:33.603: ERROR/AndroidRuntime(4157):  ... 15 more 

도움 주셔서 감사합니다.

새로운 로그 캣 : 따옴표 나를 돕는 사람들에게

>12-06 16:34:30.585: ERROR/AndroidRuntime(4870): FATAL EXCEPTION: main 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870): java.lang.IllegalStateException: Could not execute method of the activity 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at android.view.View$1.onClick(View.java:2072) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at android.view.View.performClick(View.java:2408) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at android.view.View$PerformClick.run(View.java:8816) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at android.os.Handler.handleCallback(Handler.java:587) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at android.os.Handler.dispatchMessage(Handler.java:92) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at android.os.Looper.loop(Looper.java:123) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at java.lang.reflect.Method.invoke(Method.java:521) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at dalvik.system.NativeStart.main(Native Method) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870): Caused by: java.lang.reflect.InvocationTargetException 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at com.android.iPirate.HelloTabWidget.findSong(HelloTabWidget.java:71) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at java.lang.reflect.Method.invoke(Method.java:521) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at android.view.View$1.onClick(View.java:2067) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  ... 11 more 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870): Caused by: java.net.MalformedURLException: Protocol not found: 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at java.net.URL.<init>(URL.java:275) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at java.net.URL.<init>(URL.java:159) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  at com.android.iPirate.HelloTabWidget.getURL(HelloTabWidget.java:129) 
12-06 16:34:30.585: ERROR/AndroidRuntime(4870):  ... 15 more 

그리고 감사합니다. 그들을 알아낼 수 없다! : D

+0

해당 기기의 브라우저를 사용하여 'www.youtube.com'에 액세스 할 수 있습니까? –

+0

예. 매력처럼 작동합니다. – GeauxSaints53

답변

-1

내 제안은 onCLickLIsteners을 XML로 설정하지 않는 것입니다. 코드에서 수행하십시오.

+1

-1 : 왜 안 되니? 이 문제는 분명히 여기에 없으며 청취자를 추가하는 편리한 방법이며 적은 수의 코드와 혼잡함도 필요합니다. 그것은 여전히 ​​코드 내 청취자만큼 디버깅 가능합니다 (logcats를 읽을 수 있다고 가정 할 때 :)). Okay, disclaimer - 나는 onClick을 사용하지 않습니다. 왜냐하면 저는 구식 사생아이기 때문에 onClick을 실천하는 것이 바람직하지 않습니다. – EboMike

+0

5 페이지의 코드를 읽지 않을 것이므로 전체 질문을 읽지 않았습니다. 그러나 제목은 그가 onclick에 문제가있는 것을 제안합니다. – Falmarri

0

HelloTabWidget.java 파일의 어떤 줄이 111 줄입니까? 'getURL()'메소드에서 SocketException이 발생했습니다.

+0

BufferedReader in = 새 BufferedReader (새 InputStreamReader (url.openStream())); – GeauxSaints53

2

소켓을 열고 있기 때문에 의심 스럽지만 INTERNET 권한을 선언하지 않았습니다. 이것을 < 응용 프로그램 > 태그 외부의 매니페스트에 추가하십시오.

<uses-permission android:name="android.permission.INTERNET"/> 
+0

감사합니다. 소켓 예외가 제거되었습니다. 이제 버튼을 누르면 앱이 즉시 종료되는 것보다는 일부 작업을 먼저 수행하는 것처럼 보입니다. 그러나 나는 여전히 처음 몇 가지 예외 문제가 있습니다. 원래 게시판에 새 logcat을 올렸습니다. – GeauxSaints53

+0

인터넷에 연결되어 있습니까? 귀하의 logcat을보십시오 : UnknownHostException : 호스트가 해결되지 않았습니다 : www.youtube.com:80 – EboMike

+0

예, 에뮬레이터와 실제 장치에서 실행하려고 시도했지만 동일한 로그를 얻었습니다. – GeauxSaints53

0

마지막 logcat 출력에서 ​​판단한 것처럼 지나가는 URL의 형식이 잘못되었습니다. Log.d()을 사용하여 URL을 기록하고 URL이 실제로 어떻게 보이는지 확인하십시오.

0

TabHost를 한 번 사용했는데 비슷한 오류가 발생했습니다. 제 사건의 잘못은 내 선언서에있었습니다. 나는 철자 오류를 만들었는데, 매니 페스트에 추가 한 활동은 다음과 같이 작성되었습니다. 목록 대신 .list를 사용하면 오류가 발생합니다. 유일한 것은 대문자가 아닌 한 글자입니다. :) 오류를 찾으려면 먼저 try catch 블록에서 코드를 가져 와서 더 많은 제어가 이루어 지도록하십시오. 이렇게하면 예외가 정확히 throw되는 이유와 그 이유를 찾을 수 있습니다. 그 후에는 아마 당신의 문제를 발견 할 것입니다.

1

이클립스에서 만들 때 메인 클래스의 이름을 변경하지 마십시오.

새 프로젝트를 만들고 파일을 추가하십시오. 그리고 다시 실행 해보십시오.

관련 문제