0

初めての Android アプリであるサウンドボード/着信音アプリをコーディングしていますが、Toast 通知が表示されないという問題があります。DownloadManager を呼び出し、インターネットから mp3 をダウンロードし、それを SD カードに保存し、着信音として割り当てるボタンがあります。これはすべて正常に機能しますが、DownloadManager が終了した後で、Receiver の登録を解除する必要があることはわかっています。DownloadManager.STATUS_SUCCESSFUL が通過したら、「Ringtone Has Been Set」というトーストがポップアップするようにしたいのですが、「onStop / unregisterReceiver」ブロックをコメントアウトすると機能します。そのブロックを再度アクティブにすると、Toast は表示されません。私はどんな助けにも感謝しています。繰り返しますが、私はAndroidコーディングやプログラミングにまったく慣れていません。ありがとう!

package com.gameringers.ffringers;

import java.io.File;


import android.app.Activity;
import android.app.DownloadManager;
import android.app.DownloadManager.Query;
import android.app.DownloadManager.Request;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;

import android.widget.Toast;

public class DownloadActivity extends Activity {
private long enqueue;
private DownloadManager dm;



/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent = getIntent();
    String songfile = intent.getStringExtra(FFVI.SONG_FILE);
    String songtitle = intent.getStringExtra(FFVI.SONG_TITLE);
    setContentView(R.layout.activity_download);

    BroadcastReceiver receiver = new BroadcastReceiver()

    {


        @Override
        public void onReceive(Context context, Intent intent)
        {



                Query query = new Query();

                Cursor c = dm.query(query);
                if (c.moveToFirst()) {
                    int columnIndex = c
                            .getColumnIndex(DownloadManager.COLUMN_STATUS);

                    if (DownloadManager.STATUS_SUCCESSFUL == c
                            .getInt(columnIndex)) {

                        Toast.makeText(getBaseContext(), "Ringtone Has Been Set!",
                                Toast.LENGTH_LONG).show();  

                          finish();

                    }

                  } 

                }   

           // }


    };  


    registerReceiver(receiver, new IntentFilter(
            DownloadManager.ACTION_DOWNLOAD_COMPLETE));


    String path=(Environment.getExternalStorageDirectory()+"/gameringers");
   // String filename="Test11"+".mp3"; 

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse(path+songfile)));

    File k = new File(path, songfile);

    ContentValues values = new ContentValues();
    values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
    values.put(MediaStore.MediaColumns.TITLE, (songtitle));
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
    values.put(MediaStore.Audio.Media.ARTIST, "N/A");
    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);

    //Insert it into the database
    Uri newUri= this.getContentResolver().insert(MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()), values);

    RingtoneManager.setActualDefaultRingtoneUri(
    this,
    RingtoneManager.TYPE_RINGTONE,
    newUri);


    onStop();
    {

        unregisterReceiver(receiver);
        super.onStop();
    }

}







public void setringtone(View v) {

    Intent intent = getIntent();
    String songfile = intent.getStringExtra(FFVI.SONG_FILE);
    String songtitle = intent.getStringExtra(FFVI.SONG_TITLE);
     Toast.makeText(getBaseContext(), songfile+songtitle,
            Toast.LENGTH_LONG).show();


    dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);


    Request request = new Request(
            Uri.parse("http://www.gameringers.com/ringers/ff/"+songfile));

    request.setDestinationInExternalPublicDir("/gameringers",songfile);

    enqueue = dm.enqueue(request);



}


} 
4

2 に答える 2

0
@Override
public void onStop();
{
   unregisterReceiver(mReceiver);
   mReceiver = null;
   super.onStop();
}

間違いなく正しいです。コードのどこに配置するかを理解する必要がありました。それは今動作します!! ありがとう!

于 2012-08-23T19:14:26.030 に答える
0
onStop();
{

    unregisterReceiver(receiver);
    super.onStop();
}

質問の上記のコードは奇妙に見えます。正しいものは

/** Receiver for download completion */
BroadcastReceiver mReceiver;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent = getIntent();
    String songfile = intent.getStringExtra(FFVI.SONG_FILE);
    String songtitle = intent.getStringExtra(FFVI.SONG_TITLE);
    setContentView(R.layout.activity_download);

    mReceiver = new BroadcastReceiver()

    {


        @Override
        public void onReceive(Context context, Intent intent)
        {
                Query query = new Query();

                Cursor c = dm.query(query);
                if (c.moveToFirst()) {
                    int columnIndex = c
                            .getColumnIndex(DownloadManager.COLUMN_STATUS);

                    if (DownloadManager.STATUS_SUCCESSFUL == c
                            .getInt(columnIndex)) {

                        Toast.makeText(getBaseContext(), "Ringtone Has Been Set!",
                                Toast.LENGTH_LONG).show();  

                          finish();

                    }

                  } 

                }   

           // }


    };  


    registerReceiver(receiver, new IntentFilter(
            DownloadManager.ACTION_DOWNLOAD_COMPLETE));


    String path=(Environment.getExternalStorageDirectory()+"/gameringers");
   // String filename="Test11"+".mp3"; 

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse(path+songfile)));

    File k = new File(path, songfile);

    ContentValues values = new ContentValues();
    values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
    values.put(MediaStore.MediaColumns.TITLE, (songtitle));
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
    values.put(MediaStore.Audio.Media.ARTIST, "N/A");
    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);

    //Insert it into the database
    Uri newUri= this.getContentResolver().insert(MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()), values);

    RingtoneManager.setActualDefaultRingtoneUri(
    this,
    RingtoneManager.TYPE_RINGTONE,
    newUri);
}

@Override
public void onStop();
{
   unregisterReceiver(mReceiver);
   mReceiver = null;
   super.onStop();
}


public void setringtone(View v) {

    Intent intent = getIntent();
    String songfile = intent.getStringExtra(FFVI.SONG_FILE);
    String songtitle = intent.getStringExtra(FFVI.SONG_TITLE);
     Toast.makeText(getBaseContext(), songfile+songtitle,
            Toast.LENGTH_LONG).show();
}

したがって、現在持っているコードでは、 onStop() を呼び出して、自分の onCreate() メソッドでレシーバーを登録解除するだけです。単なる構文エラーだと思います。

于 2012-08-23T02:32:11.650 に答える