- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
您好,开发人员,我有一部分可以抓取视频的帧...似乎可以正常工作,但其中一部分会出现非法参数异常...当我设置视频路径时会崩溃。这是我的代码,它在行崩溃
mediaMetadataRetriever.setDataSource(getBaseContext(),uri)
这是完整的代码:
import java.io.IOException;
import android.graphics.Bitmap;
import android.media.MediaMetadataRetriever;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView;
public class MainActivity extends Activity {
MediaMetadataRetriever mediaMetadataRetriever;
MediaController myMediaController;
VideoView myVideoView;
String viewSource = "/storage/test.mp4";
// String viewSource = "/storage/test.mp4";
Uri uri = null;
@TargetApi(Build.VERSION_CODES.GINGERBREAD_MR1)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
AssetFileDescriptor afd = getAssets().openFd("test.mp4");
Log.v("MA", "Before setdatasource");
uri = Uri.parse("E:/test.mp4");
mediaMetadataRetriever = new MediaMetadataRetriever();
**mediaMetadataRetriever.setDataSource(getBaseContext(),uri);**
// mediaMetadataRetriever.setDataSource(afd.getFileDescriptor(),
// afd.getStartOffset(), afd.getLength());
Log.v("MA", "After setdatasource" + afd.getStartOffset());
myVideoView = (VideoView) findViewById(R.id.videoview);
Log.v("MA", "VIdeoview found");
myVideoView.setVideoURI(Uri.parse(viewSource));
Log.v("MA", "After setdatasource");
myMediaController = new MediaController(this);
Log.v("MA", "After setdatasource");
myVideoView.setMediaController(myMediaController);
Log.v("MA", "myMediaController initialised");
myVideoView.setOnCompletionListener(myVideoViewCompletionListener);
Log.v("MA", "setOnCompletionListener");
myVideoView.setOnPreparedListener(MyVideoViewPreparedListener);
Log.v("MA", "setOnPreparedListener");
myVideoView.setOnErrorListener(myVideoViewErrorListener);
Log.v("MA", "setOnErrorListener");
myVideoView.requestFocus();
Log.v("MA", "focus set");
myVideoView.start();
Log.v("MA", "video started");
Button buttonCapture = (Button) findViewById(R.id.capture);
buttonCapture.setOnClickListener(new OnClickListener() {
@TargetApi(Build.VERSION_CODES.GINGERBREAD_MR1)
@Override
public void onClick(View arg0) {
int currentPosition = myVideoView.getCurrentPosition(); // in
// millisecond
Toast.makeText(MainActivity.this,
"Current Position: " + currentPosition + " (ms)",
Toast.LENGTH_LONG).show();
Bitmap bmFrame = mediaMetadataRetriever
.getFrameAtTime(currentPosition * 1000); // unit in
// microsecond
if (bmFrame == null) {
Toast.makeText(MainActivity.this, "bmFrame == null!",
Toast.LENGTH_LONG).show();
} else {
AlertDialog.Builder myCaptureDialog = new AlertDialog.Builder(
MainActivity.this);
ImageView capturedImageView = new ImageView(
MainActivity.this);
capturedImageView.setImageBitmap(bmFrame);
LayoutParams capturedImageViewLayoutParams = new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
capturedImageView
.setLayoutParams(capturedImageViewLayoutParams);
myCaptureDialog.setView(capturedImageView);
myCaptureDialog.show();
}
}
});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
MediaPlayer.OnCompletionListener myVideoViewCompletionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer arg0) {
Toast.makeText(MainActivity.this, "End of Video", Toast.LENGTH_LONG)
.show();
}
};
MediaPlayer.OnPreparedListener MyVideoViewPreparedListener = new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
long duration = myVideoView.getDuration(); // in millisecond
Toast.makeText(MainActivity.this,
"Duration: " + duration + " (ms)", Toast.LENGTH_LONG)
.show();
}
};
MediaPlayer.OnErrorListener myVideoViewErrorListener = new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Toast.makeText(MainActivity.this, "Error!!!", Toast.LENGTH_LONG)
.show();
return true;
}
};
}
E/AndroidRuntime( 4317): FATAL EXCEPTION: main
E/AndroidRuntime( 4317): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.captureframe/com.example.captureframe.MainActivity}: java.lang.IllegalArgumentException
E/AndroidRuntime( 4317): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
E/AndroidRuntime( 4317): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
E/AndroidRuntime( 4317): at android.app.ActivityThread.access$600(ActivityThread.java:141)
E/AndroidRuntime( 4317): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
E/AndroidRuntime( 4317): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 4317): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 4317): at android.app.ActivityThread.main(ActivityThread.java:5103)
E/AndroidRuntime( 4317): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 4317): at java.lang.reflect.Method.invoke(Method.java:525)
E/AndroidRuntime( 4317): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
E/AndroidRuntime( 4317): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/AndroidRuntime( 4317): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 4317): Caused by: java.lang.IllegalArgumentException
E/AndroidRuntime( 4317): at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:165)
E/AndroidRuntime( 4317): at com.example.captureframe.MainActivity.onCreate(MainActivity.java:46)
E/AndroidRuntime( 4317): at android.app.Activity.performCreate(Activity.java:5133)
E/AndroidRuntime( 4317): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
E/AndroidRuntime( 4317): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
最佳答案
使用此方法。
public static Bitmap retriveVideoFrameFromVideo(String videoPath)
throws Throwable
{
Bitmap bitmap = null;
MediaMetadataRetriever mediaMetadataRetriever = null;
try
{
mediaMetadataRetriever = new MediaMetadataRetriever();
if (Build.VERSION.SDK_INT >= 14)
mediaMetadataRetriever.setDataSource(videoPath, new HashMap<String, String>());
else
mediaMetadataRetriever.setDataSource(videoPath);
// mediaMetadataRetriever.setDataSource(videoPath);
bitmap = mediaMetadataRetriever.getFrameAtTime();
}
catch (Exception e)
{
e.printStackTrace();
throw new Throwable(
"Exception in retriveVideoFrameFromVideo(String videoPath)"
+ e.getMessage());
}
finally
{
if (mediaMetadataRetriever != null)
{
mediaMetadataRetriever.release();
}
}
return bitmap;
}
关于java - mediaMetadataRetriever.setDataSource(getBaseContext(),uri)引发非法参数异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27561859/
我想实现一个音频管理器,但我不太清楚该把它放在哪个类中。如果我放在 onCreate 中,我无法引用它,但如果我把它放在我的 Broadcast Receiver 类中,它找不到 getBaseCon
此代码用于尝试 registation.class android studio 应用程序来解析数据。我的代码在最后的 getBaseContext() 代码下不断给我错误,我不知道为什么,因为我认为
我想尝试使用以下代码从我的设置中获取一些值: import android.content.SharedPreferences; import android.preference.Preferenc
如果我没理解错的话,您可以使用 getContext() 获取 View 对象的上下文。如果你想创建一个只要 Activity 存在就存在的新对象,你可以使用 Activity 上下文或 this,否
this 经常引用当前上下文。但是,在某些情况下,为什么我们必须使用 getBaseContext() 而不是 this。 (这意味着当使用 this 时会注意到错误)。 这是我的例子: Spinne
大家好,我在理解上下文并在 makeText 中使用它时遇到问题 我在这个网站上看到了很多问题,并阅读了 Android 文档中的上下文并在 makeText 方法中使用它。但我仍然不明白很多东西:
这个问题在这里已经有了答案: What's the difference between the various methods to get an Android Context? (8 个答案)
我正在创建一个从另一个类扩展的模块,但我需要使用 getBaseContext()。如何在我自己的模块中使用它?如果我必须运行该 Activity ,那么如果不是如何解决问题,该怎么做谢谢 publi
我有这个方法可以从正常的 Activity 中调用: getBaseContext().getResources().updateConfiguration(config2, getBaseConte
有什么区别: getApplicationContext() getBasecontext() getApplication() getParent() 你能用一个简单的例子详细说明吗? 最佳答案 g
在我的应用程序中,我使用 Toasts Toast.makeText(getBaseContext(), "Updating...", Toast.LENGTH_SHORT).show(); 到目前为
我正在尝试在我的应用程序中使用 firebase 远程配置功能。但我收到错误“无法解析方法‘getBaseContext()’”。我的类扩展了如下所示的 BaseAdapter。我仅限于使用方法,请帮
您好,开发人员,我有一部分可以抓取视频的帧...似乎可以正常工作,但其中一部分会出现非法参数异常...当我设置视频路径时会崩溃。这是我的代码,它在行崩溃 mediaMetadataRetriever.
getContext() 、 getApplicationContext() 、 getBaseContext() 和 "this 有什么区别>”? 虽然这是一个简单的问题,但我无法理解它们之间的基本
我正在创建一个类似 Geocoder 的对象。 Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault()); 我在
我是 android 新手,我正在尝试了解 getApplication()、getApplicationContext()、getBaseContext() 之间的区别>、getContext()
我在谷歌上搜索了很多这个问题,并发现了许多关于何时使用 getBaseContext、getApplicationContext 或 Activity 自己的 this 的不同建议指针。 三个经常出现
我是一名优秀的程序员,十分优秀!