android - 多次按下后如何修复按钮停止功能?
问题描述
我的应用程序上的按钮在反复按下它们多次以及扫描一堆二维码后停止播放音乐。
我开发了一个应用程序。它扫描二维码。二维码包含一个数字。该应用程序绘制与该数字相关的图像并显示。然后在背景中也播放了与该号码相关的音乐。共有三个按钮,Go Back、Song、Talk。按下 Song 按钮时,背景音乐将再次播放。按下通话按钮时,会播放单独的音轨,并且可以通过反复按下按钮反复播放。Go Back 按钮将用户带到扫描仪屏幕。
这是主要活动:
package com.example.folio;
import android.Manifest;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.media.Image;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.google.firebase.FirebaseApp;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import com.google.zxing.Result;
import org.w3c.dom.Text;
import me.dm7.barcodescanner.zxing.ZXingScannerView;
//import sun.applet.Main;
public class MainActivity extends AppCompatActivity implements ZXingScannerView.ResultHandler {
private DatabaseReference databaseRef;
private static final int REQUEST_CAMERA=1;
private ZXingScannerView scannerView;
private Integer images[]={
R.drawable.pussinboots,
R.drawable.mickeymouse,
R.drawable.garfield,
R.drawable.ben10,
R.drawable.kungfupanda,
R.drawable.snowwhite,
R.drawable.mrgringe,
R.drawable.scooby,
R.drawable.shaggy,
R.drawable.shrek,
R.drawable.superman,
R.drawable.lionking
};
private String imageNames[]={
"Puss in Boots",
"Mickey Mouse",
"Garfield",
"Ben 10",
"Kungfu Panda",
"Snow White",
"Mr Grinch",
"Scooby",
"Shaggy",
"Shrek",
"Super Man",
"Lion King"
};
MediaPlayer mediaPlayer;
private void mediaplayersong(String index)
{
switch(index)
{
case "Puss in Boots" : mediaPlayer=MediaPlayer.create(this, R.raw.pussinboots);
break;
case "Mickey Mouse" : mediaPlayer=MediaPlayer.create(this, R.raw.mickeymouse);
break;
case "Garfield" : mediaPlayer=MediaPlayer.create(this, R.raw.garfield);
break;
case "Ben 10" :mediaPlayer=MediaPlayer.create(this, R.raw.ben10);
break;
case "Kungfu Panda" : mediaPlayer=MediaPlayer.create(this, R.raw.kungfupanda);
break;
case "Snow White" : mediaPlayer=MediaPlayer.create(this, R.raw.snowwhite);
break;
case "Mr Grinch" : mediaPlayer=MediaPlayer.create(this, R.raw.mrgrinch);
break;
case "Scooby" : mediaPlayer=MediaPlayer.create(this, R.raw.scooby);
break;
case "Shaggy" : mediaPlayer=MediaPlayer.create(this, R.raw.scooby);
break;
case "Shrek" : mediaPlayer=MediaPlayer.create(this, R.raw.shrek);
break;
case "Super Man" : mediaPlayer=MediaPlayer.create(this, R.raw.superman);
break;
case "Lion King" : mediaPlayer=MediaPlayer.create(this, R.raw.lionking);
break;
}
}
private void mediaplayervoice(String index)
{
switch (index)
{
case "Puss in Boots" : mediaPlayer=MediaPlayer.create(this, R.raw.pussinbootstalk);
break;
case "Mickey Mouse" : mediaPlayer=MediaPlayer.create(this, R.raw.mickeymousetalk);
break;
case "Garfield" : mediaPlayer=MediaPlayer.create(this, R.raw.garfieldtalk);
break;
case "Ben 10" :mediaPlayer=MediaPlayer.create(this, R.raw.ben10talk);
break;
case "Kungfu Panda" : mediaPlayer=MediaPlayer.create(this, R.raw.kungfupandatalk);
break;
case "Snow White" : mediaPlayer=MediaPlayer.create(this, R.raw.snowwhitetalk);
break;
case "Mr Grinch" : mediaPlayer=MediaPlayer.create(this, R.raw.mrgrinchtalk);
break;
case "Scooby" : mediaPlayer=MediaPlayer.create(this, R.raw.scoobytalk);
break;
case "Shaggy" : mediaPlayer=MediaPlayer.create(this, R.raw.shaggytalk);
break;
case "Shrek" : mediaPlayer=MediaPlayer.create(this, R.raw.shrektalk);
break;
case "Super Man" : mediaPlayer=MediaPlayer.create(this, R.raw.supermantalk);
break;
case "Lion King" : mediaPlayer=MediaPlayer.create(this, R.raw.lionkingtalk);
break;
}
}
private int arraySize=images.length;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
scannerView=new ZXingScannerView(this);
setContentView(scannerView);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
if(checkPermission())
{
Toast.makeText(MainActivity.this, "Permission granted!", Toast.LENGTH_LONG).show();
}
else
{
requestPermission();
}
}
}
private boolean checkPermission()
{
return (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)== PackageManager.PERMISSION_GRANTED);
}
private void requestPermission()
{
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA);
}
public void onRequestPermissionsResult(int requestCode, String permission[], int grantResults[])
{
switch(requestCode)
{
case REQUEST_CAMERA:
if(grantResults.length>0)
{
boolean cameraAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
if(cameraAccepted)
{
Toast.makeText(MainActivity.this, "Permission Granted!", Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(MainActivity.this, "Permission Denied!", Toast.LENGTH_LONG).show();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
if(shouldShowRequestPermissionRationale(Manifest.permission.CAMERA))
{
displayAlertMessage("Please allow access!", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA);
}
});
return;
}
}
}
}
break;
}
}
@Override
public void onResume()
{
super.onResume();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
if(checkPermission())
{
if(scannerView==null)
{
scannerView=new ZXingScannerView(this);
setContentView(scannerView);
}
scannerView.setResultHandler(this);
scannerView.startCamera();
}
else
{
requestPermission();
}
}
}
@Override
public void onDestroy()
{
super.onDestroy();
scannerView.stopCamera();
}
public void displayAlertMessage(String message, DialogInterface.OnClickListener listener)
{
new AlertDialog.Builder(MainActivity.this)
.setMessage(message)
.setPositiveButton("Ok", listener)
.setNegativeButton("Cancel", null)
.create()
.show();
}
@Override
public void handleResult(Result result) {
final String scanResult = result.getText();
if(!TextUtils.isEmpty(scanResult) && TextUtils.isDigitsOnly(scanResult))
{
final int number = Integer.parseInt(scanResult);
if(number<arraySize) {
setContentView(R.layout.activity_main);
ImageView imageView=(ImageView)findViewById(R.id.mainImageView);
TextView textView=(TextView)findViewById(R.id.text_view_character_name);
imageView.setImageResource(images[number]);
textView.setText(imageNames[number]);
mediaplayersong(imageNames[number]);
mediaPlayer.start();
final Button buttonTalk=(Button)findViewById(R.id.buttonTalk);
buttonTalk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer.stop();
mediaplayervoice(imageNames[number]);
mediaPlayer.start();
}
});
final Button buttonSong=(Button)findViewById(R.id.buttonSong);
buttonSong.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer.stop();
mediaplayersong(imageNames[number]);
mediaPlayer.start();
}
});
final Button buttonGoBack=(Button)findViewById(R.id.buttonGoBack);
buttonGoBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer.stop();
setContentView(scannerView);
scannerView.resumeCameraPreview(MainActivity.this);
}
});
}
else
{
feedback("Invalid QR Code "+number);
}
}
else
{
feedback("Invalid QR code! "+scanResult);
}
}
private void feedback(String status)
{
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle("Scan result");
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
scannerView.resumeCameraPreview(MainActivity.this);
}
});
builder.setMessage(status);
AlertDialog alert=builder.create();
alert.show();
}
}
当我在按下歌曲和通话按钮的同时扫描一堆二维码以查看它是如何工作的,经过一定的尝试后,歌曲停止播放。无论我单击歌曲按钮还是通话按钮,都不会播放音频。返回按钮将我完美地带到扫描仪,但在我重新启动应用程序之前我无法播放音频。
解决方案
我猜这个问题的存在是因为您试图在主 UI 线程上执行相对繁重的任务。所以它可能会给你一个不起作用的灰色按钮。这可以通过在你的程序中使用AsyncTask、Handler、Thread等扫描二维码、播放音乐来解决。
检查此链接以使用 AsyncTask。AsyncTask + WeakReference - Android Studio 教程
提示在执行任何需要额外内存空间 (RAM) 或计算密集型的工作时,最好将它们放在另一个线程中,以免干扰主 UI 线程。否则用户将被迫退出无响应的应用程序。
推荐阅读
- python - Numpy直方图在小数据集上非常慢
- oracle - Oracle 表中存储“隐藏”小数位的数字列
- node.js - Hyperledger Indy 中的 PoolLedgerTimeout
- swift - UITableViewDiffableDataSource 设置不同的单元格动画
- html - Chrome 设备模式看起来与实际设备不同
- python - 没有名为“uff”的模块
- c++ - _mm256_movemask_epi8 到 uint64_t
- scala - 如何解决akka http测试和akka测试套件中的ActorSystem冲突
- grammar - 编写自己的 CFG 的提示
- google-cloud-platform - 无法使用 CDAP RESTAPI 上传数据融合插件 json 文件