2

私は非常に奇妙な問題を抱えています。SherlockActionBarを使用しているときに、コンテキストアクションバーを正常にセットアップしました。アクションモードボタンの1つを選択すると、トーストメッセージの表示が正常に機能します。それをへのメソッド呼び出しと交換するとsaveRing()、力が近くなります。エラーは私のsaveRing()メソッド内にある必要がありますが、私はそれを理解できません。saveRingポップアップコンテキストメニューから呼び出したとき、このメソッドは正常に機能しました。

私のsaveRing():

public boolean saveRing(int raw_resource, String title) {
        byte[] buffer = null;
        InputStream fIn = getBaseContext().getResources()
                .openRawResource(raw_resource);
        int size = 0;

        try {
            size = fIn.available();
            buffer = new byte[size];
            fIn.read(buffer);
            fIn.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            return false;
        }

        String path = "/sdcard/media/audio/ringtones/";
        String filename = title + ".mp3";

        boolean exists = (new File(path)).exists();
        if (!exists) {
            new File(path).mkdirs();
        }
        FileOutputStream save;
        try {
            save = new FileOutputStream(path + filename);
            save.write(buffer);
            save.flush();
            save.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
        sendBroadcast(
                new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri
                        .parse("file://" + path + filename)));

        File k = new File(path, filename);

        ContentValues values = new ContentValues();
        values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
        values.put(MediaStore.MediaColumns.TITLE, title);
        values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
        values.put(MediaStore.Audio.Media.ARTIST, "Epic Meal Time ");
        values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
        values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
        values.put(MediaStore.Audio.Media.IS_ALARM, false);
        values.put(MediaStore.Audio.Media.IS_MUSIC, false);

        Uri pURI = MediaStore.Audio.Media.getContentUriForPath(k
                .getAbsolutePath());

        // remove entry every time so we don't get duplicate entries and have a
        // problem setting a 2nd time
        getContentResolver().delete(
                pURI,
                MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath()
                        + "\"", null);

        Uri nURI = getContentResolver().insert(pURI,
                values);

        RingtoneManager.setActualDefaultRingtoneUri(this,
                RingtoneManager.TYPE_RINGTONE, nURI);
        Toast.makeText(this, title + " Ringtone set",
                Toast.LENGTH_LONG).show();

        return true;
    }

Logcat:

02-19 21:38:47.691: E/AndroidRuntime(20492): FATAL EXCEPTION: main
02-19 21:38:47.691: E/AndroidRuntime(20492): java.lang.NullPointerException
02-19 21:38:47.691: E/AndroidRuntime(20492):    at vartanian.android.epicmealtimepro.Tab3Fragment$mActionModeCallback.onActionItemClicked(Tab3Fragment.java:346)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.actionbarsherlock.internal.ActionBarSherlockNative$ActionModeCallbackWrapper.onActionItemClicked(ActionBarSherlockNative.java:243)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onActionItemClicked(PhoneWindow.java:2552)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.android.internal.app.ActionBarImpl$ActionModeImpl.onMenuItemSelected(ActionBarImpl.java:931)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:514)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:99)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at android.view.View.performClick(View.java:4091)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at android.view.View$PerformClick.run(View.java:17036)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at android.os.Handler.handleCallback(Handler.java:615)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at android.os.Handler.dispatchMessage(Handler.java:92)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at android.os.Looper.loop(Looper.java:137)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at android.app.ActivityThread.main(ActivityThread.java:4962)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at java.lang.reflect.Method.invokeNative(Native Method)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at java.lang.reflect.Method.invoke(Method.java:511)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
02-19 21:38:47.691: E/AndroidRuntime(20492):    at dalvik.system.NativeStart.main(Native Method)
02-19 21:38:49.262: I/Process(20492): Sending signal. PID: 20492 SIG: 9

ありがとう!編集:これが346行目の私のコードです:ma.saveRing(R.raw.quaq_language, values[2]);

エラーのある行は、ListFragmentのどの項目がCABを呼び出すかによって異なります。私はそれを次のswitchようなステートメントで設定しています:

case R.id.ringtone:
                switch (viewId) {
                case 0:
                    ma.saveRing(R.raw.ohhh_gurllll, values[0]);
                    break;
                case 1:
                    ma.saveRing(R.raw.pork_balls, values[1]);
                    break;

viewIdListFragment内の位置です。問題はvalues[]がnullであるように見えますが、理由はわかりません。これは初期化される場所です:

public class Tab3Fragment extends SherlockListFragment {

    String[] values = new String[] { "Ohh Gurl", "Pork Balls", "Language",
            "Really Good Idea", "Rice Paper Bacon Condom",
            "Rise and Shine", "Roll One Up Homie",
            "Save The Hate For Twitter", "Snap, Crackle, Pop",
            "Let's Get Girls", "Spanish",
            "We Make Steak Look Like Cabbage", "Wake Up McDonalds",
            "Super Moist", "Stupid, Tasty Birds", "Bacon Moment",
            "Today We Eat Smart", "We Are Gonna Die On Youtube",
            "Drunk Off Pancakes", "Ketchup", "We Eat All Our Babies",
            "Maximum Meat Experience", "Stop Hating", "What Up Bitches",
            "Whatcha Know About Bullets",
            "Whatcha Know About Terrible Food", "CANADA", "Beiber Concert",
            "Ending Riceism", "You Ain't Got What We Got", "F*cking Noob",
            "Constructed Meat Base", "Want Some Of These Nuts" };

これは、arrayadapterを埋める文字列配列です。

4

1 に答える 1

0

So I finally figured it out. I passed getSherlockActivity() into my saveRing() and used that context throughout the method. I'm not sure why there was a problem with using the SherlockFragmentActivity context but this is how it looks:

public boolean saveRing(int raw_resource, String title, Context context) {
        byte[] buffer = null;
        InputStream fIn = context.getResources()
                .openRawResource(raw_resource);
        int size = 0;

        try {
            size = fIn.available();
            buffer = new byte[size];
            fIn.read(buffer);
            fIn.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            return false;
        }

        String path = "/sdcard/media/audio/ringtones/";
        String filename = title + ".mp3";

        boolean exists = (new File(path)).exists();
        if (!exists) {
            new File(path).mkdirs();
        }
        FileOutputStream save;
        try {
            save = new FileOutputStream(path + filename);
            save.write(buffer);
            save.flush();
            save.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
        context.sendBroadcast(
                new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri
                        .parse("file://" + path + filename)));

        File k = new File(path, filename);

        ContentValues values = new ContentValues();
        values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
        values.put(MediaStore.MediaColumns.TITLE, title);
        values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
        values.put(MediaStore.Audio.Media.ARTIST, "Epic Meal Time ");
        values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
        values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
        values.put(MediaStore.Audio.Media.IS_ALARM, false);
        values.put(MediaStore.Audio.Media.IS_MUSIC, false);

        Uri pURI = MediaStore.Audio.Media.getContentUriForPath(k
                .getAbsolutePath());

        // remove entry every time so we don't get duplicate entries and have a
        // problem setting a 2nd time
        context.getContentResolver().delete(
                pURI,
                MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath()
                        + "\"", null);

        Uri nURI = context.getContentResolver().insert(pURI,
                values);

        RingtoneManager.setActualDefaultRingtoneUri(context,
                RingtoneManager.TYPE_RINGTONE, nURI);
        Toast.makeText(context, title + " Ringtone set",
                Toast.LENGTH_LONG).show();

        return true;
    }
于 2013-02-21T04:08:49.293 に答える