3

我在编写应用程序方面有点新手,我正在做一个学校项目。我刚刚完成程序,现在只是调试。我遇到了一个似乎无法解决的主要问题,涉及通过单击按钮调用方法。该程序旨在在用户输入搜索词后下载文件。

最初,我的 logcat 告诉我在 HelloTabWidget 类中找不到该方法。我最初在 SearchActivity 类中有 findSong 方法,因此我将 SearchActivity 中的几乎所有代码都移到了 HelloTabWidget 中,因为无论如何这似乎是一种查看所有内容的简单方法。现在,我在这里尝试了从 onClick 更改 xml 中的路径的提示,但这也没有解决它。相反,我从之前得到了过去的错误:“在活动 HelloTabWidget 中找不到方法 com.android.iPirate.HelloTabWidget.findSong ...”我开始认为这与方法中添加的异常有关。但我几乎不知道可以做些什么来解决这个问题。任何帮助,将不胜感激。

这是 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>

和 Logcat:

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

4

6 回答 6

2

我怀疑这是因为您正在打开一个套接字,但没有声明INTERNET许可。尝试将其添加到 <application> 标记之外的清单中。

<uses-permission android:name="android.permission.INTERNET"/>
于 2010-12-06T22:07:24.183 回答
1

从 Eclipse 创建时,切勿尝试重命名主类。

创建一个新项目并添加文件。并尝试再次运行。

于 2012-07-19T05:56:03.223 回答
0

HelloTabWidget.java 文件中的哪一行是第 111 行?您SocketException在“getURL()”方法中提出了一个问题。

于 2010-12-06T22:06:43.213 回答
0

从最后一个 logcat 输出来看,您传递的 URL 似乎格式错误。尝试使用Log.d()并检查 URL 的真实外观来记录 URL。

于 2010-12-07T10:41:14.767 回答
0

我曾经使用过 TabHost,但遇到了与您非常相似的错误。我的问题出在我的清单中。我犯了一个拼写错误,我添加到清单中的活动是这样写的: .list 而不是 .List 这就是让我得到错误的原因。唯一的问题是一个字母不是大写的:)。要查找错误,首先将您的代码放入 try catch 块中以获得更多控制,这有助于您找出究竟抛出了哪些异常以及原因。在那之后你可能会发现你的问题。

于 2012-05-24T20:01:06.193 回答
-1

我的建议是不要onCLickLIsteners在 XML 中设置。用代码来做。

于 2010-12-06T21:56:30.263 回答