-1

クラスメートと私は、作成中の Android アプリケーションの問題で立ち往生しています。

アダルト コンテンツの警告実装の例として、ブラウザーの履歴/ブックマークから特定の URL を検索し、一致が見つかった場合に別のアクティビティを (正常に) 起動するアクティビティを含む Android アプリの構築に成功しました。

これは正常に機能しています。

現在、新しいサービス クラスを使用して最近の履歴の検索を実行するために、数秒ごとに継続的に実行するサービス クラスを実装していますが、いくつかの問題が発生しています。

問題は、「Nanny」ソース コードを Nanny.java からサービス クラスに追加しようとするときに、「Nanny」スクリプトが 1 回だけではなく継続的に履歴を検索することです。「Nanny」アプリケーションは継続的に強制終了します。カーソルの初期化時の null ポインター例外:if (cursor.moveToFirst()) {

私たちが持っているテストファイル(Main.java)のサービスクラスの外部でまったく同じスクリプトが実行された場合、NullPointerExceptionは発生しないため、これは少し奇妙です

動作中の Main.java と動作中のサービス クラス [数秒ごとにトーストを正常に表示する]、および [失敗した] 2 つの組み合わせを以下に示します。

空のサービス クラス:

public class Service_class extends Service {


    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
        return START_STICKY;
    }

    @Override
    public void onDestroy() {

        super.onDestroy();
        Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show();

    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

}

働く Nanny.java

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.Browser;
import android.widget.TextView;

public class Nanny extends Activity {

    String Dirty1 = "www.playboy.com";
    String Dirty2 = "www.penthouse.com";
    String Dirty3 = "www.pornhub.com";
    String Dirty4 = "www.playboy.com";
    String Dirty5 = "www.playboy.com";
    String Dirty6 = "www.playboy.com";
    String Dirty7 = "www.playboy.com";
    String Dirty8 = "www.playboy.com";
    String Dirty9 = "www.playboy.com";
    String Dirty10 = "www.playboy.com";

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nanny);
TextView tv = (TextView) findViewById(R.id.hello);
String[] projection = new String[] { Browser.BookmarkColumns.TITLE,
Browser.BookmarkColumns.URL };
Cursor cursor = managedQuery(android.provider.Browser.BOOKMARKS_URI,
        projection, null, null, null);
String urls = "";
if (cursor.moveToFirst()) {
String url1 = null;
String url2 = null;
do {
String url = cursor.getString(cursor.getColumnIndex(Browser.BookmarkColumns.URL));

if (url.toLowerCase().contains(Dirty1)) {
} else if (url.toLowerCase().contains(Dirty2)) {
} else if (url.toLowerCase().contains(Dirty3)) {
} else if (url.toLowerCase().contains(Dirty4)) {
} else if (url.toLowerCase().contains(Dirty5)) {
} else if (url.toLowerCase().contains(Dirty6)) {
} else if (url.toLowerCase().contains(Dirty7)) {
} else if (url.toLowerCase().contains(Dirty8)) {
} else if (url.toLowerCase().contains(Dirty9)) {
} else if (url.toLowerCase().contains(Dirty10)) {
//if (url.toLowerCase().contains(Filthy)) {
urls = urls
+ cursor.getString(cursor.getColumnIndex(Browser.BookmarkColumns.TITLE)) + " : "
+ url + "\n";
Intent intent = new Intent(Nanny.this, Warning.class);
Nanny.this.startActivity(intent);
}
} while (cursor.moveToNext()); 
tv.setText(urls);
}}}

NullPointerException: if (cursor.moveToFirst()) {

public class Service_class extends Service {
    String Dirty1 = "www.playboy.com";
    String Dirty2 = "www.penthouse.com";
    String Dirty3 = "www.pornhub.com";
    String Dirty4 = "www.playboy.com";
    String Dirty5 = "www.playboy.com";
    String Dirty6 = "www.playboy.com";
    String Dirty7 = "www.playboy.com";
    String Dirty8 = "www.playboy.com";
    String Dirty9 = "www.playboy.com";
    String Dirty10 = "www.playboy.com";

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
        //setContentView(R.layout.main3);
      //  TextView tv = (TextView) findViewById(R.id.hello);
        String[] projection = new String[] { Browser.BookmarkColumns.TITLE,
        Browser.BookmarkColumns.URL };
        Cursor  cursor = managedQuery(android.provider.Browser.BOOKMARKS_URI,
                projection, null, null, null);
        String urls = "";
        if (cursor.moveToFirst()) {
        String url1 = null;
        String url2 = null;
        do {
        String url = cursor.getString(cursor.getColumnIndex(Browser.BookmarkColumns.URL));

        if (url.toLowerCase().contains(Dirty1)) {
        } else if (url.toLowerCase().contains(Dirty2)) {
        } else if (url.toLowerCase().contains(Dirty3)) {
        } else if (url.toLowerCase().contains(Dirty4)) {
        } else if (url.toLowerCase().contains(Dirty5)) {
        } else if (url.toLowerCase().contains(Dirty6)) {
        } else if (url.toLowerCase().contains(Dirty7)) {
        } else if (url.toLowerCase().contains(Dirty8)) {
        } else if (url.toLowerCase().contains(Dirty9)) {
        } else if (url.toLowerCase().contains(Dirty10)) {
        urls = urls
        + cursor.getString(cursor.getColumnIndex(Browser.BookmarkColumns.TITLE)) + " : "
        + url + "\n";
        Intent warning_intent = new Intent(Service_class.this, Warning.class);
        Service_class.this.startActivity(intent);
        }
        } while (cursor.moveToNext()); 
      //  tv.setText(urls);




        return START_STICKY;

        }
        return startId;}
    @Override
    public void onDestroy() {

        super.onDestroy();
        Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show();

    }

    @Override
    public void onCreate() {
        super.onCreate();
    }
    private void setContentView(int main3) {
        // TODO Auto-generated method stub

    }

    private TextView findViewById(int hello) {
        // TODO Auto-generated method stub
        return null;
    }

    private Cursor managedQuery(Uri bookmarksUri, String[] projection,
            Object object, Object object2, Object object3) {
        // TODO Auto-generated method stub
        return null;
    }}

LOGCAT (上記の組み合わせ実装を使用する場合)

53 行目で失敗します: if (cursor.moveToFirst()) {

04-15 18:26:24.761: D/dalvikvm(7466): Late-enabling CheckJNI
04-15 18:26:25.651: D/dalvikvm(7466): GC_FOR_ALLOC freed 82K, 4% free 7379K/7608K, paused 13ms, total 13ms
04-15 18:26:25.651: I/dalvikvm-heap(7466): Grow heap (frag case) to 10.861MB for 3686416-byte allocation
04-15 18:26:25.661: D/dalvikvm(7466): GC_FOR_ALLOC freed 1K, 3% free 10977K/11212K, paused 13ms, total 13ms
04-15 18:26:25.681: D/dalvikvm(7466): GC_CONCURRENT freed <1K, 3% free 10977K/11212K, paused 3ms+2ms, total 17ms
04-15 18:26:25.901: D/dalvikvm(7466): GC_FOR_ALLOC freed <1K, 3% free 10977K/11212K, paused 11ms, total 11ms
04-15 18:26:25.911: I/dalvikvm-heap(7466): Grow heap (frag case) to 17.086MB for 6529744-byte allocation
04-15 18:26:25.931: D/dalvikvm(7466): GC_FOR_ALLOC freed 0K, 2% free 17354K/17592K, paused 13ms, total 13ms
04-15 18:26:25.941: D/dalvikvm(7466): GC_CONCURRENT freed <1K, 2% free 17354K/17592K, paused 3ms+2ms, total 16ms
04-15 18:26:26.051: D/libEGL(7466): loaded /system/lib/egl/libEGL_tegra.so
04-15 18:26:26.061: D/libEGL(7466): loaded /system/lib/egl/libGLESv1_CM_tegra.so
04-15 18:26:26.071: D/libEGL(7466): loaded /system/lib/egl/libGLESv2_tegra.so
04-15 18:26:26.091: D/OpenGLRenderer(7466): Enabling debug mode 0
04-15 18:26:31.181: D/AndroidRuntime(7466): Shutting down VM
04-15 18:26:31.181: W/dalvikvm(7466): threadid=1: thread exiting with uncaught exception (group=0x40f4f930)
04-15 18:26:31.181: E/AndroidRuntime(7466): FATAL EXCEPTION: main
04-15 18:26:31.181: E/AndroidRuntime(7466): java.lang.RuntimeException: Unable to start service com.ut.appdemo.Service_class@41698e90 with Intent { cmp=com.ut.appdemo/.Service_class }: java.lang.NullPointerException
04-15 18:26:31.181: E/AndroidRuntime(7466):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2673)
04-15 18:26:31.181: E/AndroidRuntime(7466):     at android.app.ActivityThread.access$1900(ActivityThread.java:141)
04-15 18:26:31.181: E/AndroidRuntime(7466):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1331)
04-15 18:26:31.181: E/AndroidRuntime(7466):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-15 18:26:31.181: E/AndroidRuntime(7466):     at android.os.Looper.loop(Looper.java:137)
04-15 18:26:31.181: E/AndroidRuntime(7466):     at android.app.ActivityThread.main(ActivityThread.java:5041)
04-15 18:26:31.181: E/AndroidRuntime(7466):     at java.lang.reflect.Method.invokeNative(Native Method)
04-15 18:26:31.181: E/AndroidRuntime(7466):     at java.lang.reflect.Method.invoke(Method.java:511)
04-15 18:26:31.181: E/AndroidRuntime(7466):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-15 18:26:31.181: E/AndroidRuntime(7466):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-15 18:26:31.181: E/AndroidRuntime(7466):     at dalvik.system.NativeStart.main(Native Method)
04-15 18:26:31.181: E/AndroidRuntime(7466): Caused by: java.lang.NullPointerException
04-15 18:26:31.181: E/AndroidRuntime(7466):     at com.ut.appdemo.Service_class.onStartCommand(Service_class.java:53)
04-15 18:26:31.181: E/AndroidRuntime(7466):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2656)
04-15 18:26:31.181: E/AndroidRuntime(7466):     ... 10 more
4

1 に答える 1

0

カーソルをnullに設定しています...

このメソッドを使用して、カーソルをインスタンス化します。

Cursor  cursor = managedQuery(android.provider.Browser.BOOKMARKS_URI,projection, null, null, null);

次に、次のように managedQuery() メソッドを定義します。

private Cursor managedQuery(Uri bookmarksUri, String[] projection, Object object, Object object2, Object object3) {
    // TODO Auto-generated method stub
    return null;
}}

基本的にあなたのコードは次のとおりです。

Cursor cursor = null;
curser.doSomething();

これは常に nullPointer になります。Android に飛び込む前に、Java の基礎に戻って勉強することを強くお勧めします。Java の理解が不足している状態で Android で何かを達成しようとしている場合は、頭がおかしくなるだけです。

于 2013-04-16T01:50:24.403 に答える