Android--制作开场动画/MediaPlayer.OnCompletionListener

我们在玩游戏的时候常常会现有一个开场动画,要实现这个并不难,下面将给出一个实例实现开场动画。

这个实例需要两个Activity,一个作为开场动画,一个是主程序界面,由于并不需要演示其他的东西,所以在第二个Activity里只是一个简单的TextView。

下面给出这个程序的实现截图:


下面给出实现这个程序的代码:

1.两个布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
  <TextView
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:text="@string/hello"
  />
</LinearLayout>


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
  <VideoView
    android:id="@+id/mVideoView1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
  />
</LinearLayout>

2.第一个Activity

package irdc.ex07_17;

import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.widget.VideoView;

public class EX07_17 extends Activity
{
  private VideoView v;
  
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    /* 加载start.xml Layout */
    setContentView(R.layout.start);
    /* 设定VideoView */
    v = (VideoView) findViewById(R.id.mVideoView1);
    Uri uri = Uri.parse
              (
                "android.resource://irdc.ex07_17/"+ R.raw.start
              );
    v.setVideoURI(uri);
    v.requestFocus(); 
    /* 开始播放影片 */
    v.start();
    
    /* 影片播放完后会运行的OnCompletionListener */
    v.setOnCompletionListener(new MediaPlayer.OnCompletionListener()
    {
      @Override
      public void onCompletion(MediaPlayer arg0)
      {
        /* 打开Activity EX07_17_1.java */
        Intent intent = new Intent();
        intent.setClass(EX07_17.this,EX07_17_1.class);
        startActivity(intent);
        EX07_17.this.finish();
      }
    });
  }
}

2.第二个Activity

package irdc.ex07_17;

import android.app.Activity;
import android.os.Bundle;

public class EX07_17_1 extends Activity
{  
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
  }
}


你遇到的错误: ``` TypeError: broadcast.getBroadcast is not a function ``` 是因为你在 **JavaScript 端**调用了 `broadcast.getBroadcast()`,但这个 `broadcast` 是 Android 通过 `addJavascriptInterface` 注入的一个 Java 对象,它**并不是一个 JS 对象**,也不是一个 JS 函数,所以你不能像 JS 对象一样调用它的方法。 --- ## ✅ 问题根源 你使用了如下代码将 Java 类注入到 WebView 中: ```java webView.addJavascriptInterface(new JavascriptBroadcastInterfaces(), "broadcast"); ``` 其中 `JavascriptBroadcastInterfaces` 是一个 Java 类,里面定义了一个带有 `@JavascriptInterface` 注解的方法: ```java @JavascriptInterface public void getBroadcast(String broadcast) { // ... } ``` ### ❗️但是在 JavaScript 端,你这样调用了它: ```js broadcast.getBroadcast("some string"); ``` 这在 JS 中看起来像是一个对象的方法调用,但实际上 Android 注入的接口是**扁平的**,JS 中的 `broadcast` 是一个 Java 对象代理,**只能直接调用方法名**,不能像 JS 对象那样访问属性再调用函数。 --- ## ✅ 正确的调用方式(JS 端) 在 JS 中你应该这样调用: ```js if (window.broadcast && window.broadcast.getBroadcast) { window.broadcast.getBroadcast("some string"); } else { console.error("broadcast 或 getBroadcast 方法不存在"); } ``` 但注意,有些 Android WebView 实现中,`broadcast` 会被注入到 `window` 的上下文中,但不一定是 `window.broadcast`,有时需要通过 `prompt`、`console.log`、调试器等方式确认注入成功。 --- ## ✅ Android 端代码(修正建议) 确保你开启了 JS 接口支持,并且方法是 `public` 的: ```java webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new JavascriptBroadcastInterfaces(), "broadcast"); webView.loadUrl("file:///android_asset/your_page.html"); ``` --- ## ✅ JS 端完整调用示例 ```javascript function callAndroidBroadcast(message) { if (typeof window.broadcast !== 'undefined' && typeof window.broadcast.getBroadcast === 'function') { window.broadcast.getBroadcast(message); } else { console.error("Android 接口未正确注入"); } } // 调用 callAndroidBroadcast("Hello from JS"); ``` --- ## ✅ Android 端完整代码(含播放音频) ```java public class JavascriptBroadcastInterfaces { @JavascriptInterface public void getBroadcast(String broadcast) { Log.i("Broadcast", "Received broadcast: " + broadcast); // 构造音频 URL String audioUrl = "http://192.168.3.150:816/mp3?s=" + broadcast; // 在主线程中播放音频 new Handler(Looper.getMainLooper()).post(() -> playAudio(audioUrl)); } private void playAudio(String audioUrl) { // 这里可以使用 MediaPlayer 或 ExoPlayer 实现播放 MediaPlayer mediaPlayer = new MediaPlayer(); try { mediaPlayer.setDataSource(audioUrl); mediaPlayer.prepare(); mediaPlayer.start(); } catch (IOException e) { e.printStackTrace(); } } } ``` --- ## ✅ 调试建议 ### 1. 确保 JS 接口注入成功 在 JS 中打印: ```js console.log("window.broadcast:", window.broadcast); ``` 如果 `window.broadcast` 是 `undefined`,说明没有注入成功。 ### 2. 检查 Android WebView 设置 确保: ```java webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setDomStorageEnabled(true); // 如果需要 ``` ### 3. 使用 `@JavascriptInterface` 注解 确保你的方法加了注解,否则不会暴露给 JS。 --- ## ✅ 总结 | 错误 | 原因 | 解决方案 | |------|------|----------| | `broadcast.getBroadcast is not a function` | JS 中误将 Android 接口当 JS 对象使用 | 确保调用方式为 `window.broadcast.getBroadcast()` | | `broadcast` 是 `undefined` | 接口未正确注入 | 检查 `addJavascriptInterface` 和 JS 设置 | | 方法未执行 | 没有在主线程操作 UI 或播放器 | 使用 `Handler` 切换到主线程 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值