Reputation: 397
I want to play my Vimeo videos and I've followed the steps in https://github.com/vimeo/vimeo-networking-java.
I used this method to get the Video object and then load it into a WebView.
VimeoClient.getInstance().fetchNetworkContent(String uri, ModelCallback callback)
However, when I logged the result, it seems to indicate that it fails.
Here are my 2 Java files.
MyVimeoApplication.java
import android.app.Application;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.util.Log;
import com.vimeo.networking.Configuration;
import com.vimeo.networking.Vimeo;
import com.vimeo.networking.VimeoClient;
public class MyVimeoApplication extends Application
{
private static final String SCOPE = "private public interact";
private static final boolean IS_DEBUG_BUILD = false;
// Switch to true to see how access token auth works.
private static final boolean ACCESS_TOKEN_PROVIDED = false;
private static Context mContext;
@Override
public void onCreate()
{
super.onCreate();
mContext = this;
Configuration.Builder configBuilder;
// This check is just as for the example. In practice, you'd use one technique or the other.
if (ACCESS_TOKEN_PROVIDED)
{
configBuilder = getAccessTokenBuilder();
Log.d("ACCESS_TOKEN", "PROVIDED");
}
else
{
configBuilder = getClientIdAndClientSecretBuilder();
Log.d("ACCESS_TOKEN", "NOT PROVIDED");
}
if (IS_DEBUG_BUILD) {
// Disable cert pinning if debugging (so we can intercept packets)
configBuilder.enableCertPinning(false);
configBuilder.setLogLevel(Vimeo.LogLevel.VERBOSE);
}
VimeoClient.initialize(configBuilder.build());
}
public Configuration.Builder getAccessTokenBuilder() {
// The values file is left out of git, so you'll have to provide your own access token
String accessToken = getString(R.string.access_token);
return new Configuration.Builder(accessToken);
}
public Configuration.Builder getClientIdAndClientSecretBuilder() {
// The values file is left out of git, so you'll have to provide your own id and secret
String clientId = getString(R.string.client_id);
String clientSecret = getString(R.string.client_secret);
String codeGrantRedirectUri = getString(R.string.deeplink_redirect_scheme) + "://" +
getString(R.string.deeplink_redirect_host);
Configuration.Builder configBuilder =
new Configuration.Builder(clientId, clientSecret, SCOPE, null,
null);
// configBuilder.setCacheDirectory(this.getCacheDir())
// .setUserAgentString(getUserAgentString(this)).setDebugLogger(new NetworkingLogger())
// // Used for oauth flow
// .setCodeGrantRedirectUri(codeGrantRedirectUri);
return configBuilder;
}
public static Context getAppContext() {
return mContext;
}
public static String getUserAgentString(Context context) {
String packageName = context.getPackageName();
String version = "unknown";
try {
PackageInfo pInfo = context.getPackageManager().getPackageInfo(packageName, 0);
version = pInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
System.out.println("Unable to get packageInfo: " + e.getMessage());
}
String deviceManufacturer = Build.MANUFACTURER;
String deviceModel = Build.MODEL;
String deviceBrand = Build.BRAND;
String versionString = Build.VERSION.RELEASE;
String versionSDKString = String.valueOf(Build.VERSION.SDK_INT);
return packageName + " (" + deviceManufacturer + ", " + deviceModel + ", " + deviceBrand +
", " + "Android " + versionString + "/" + versionSDKString + " Version " + version +
")";
}
}
MainActivity.java
import android.app.ProgressDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;
import android.widget.Toast;
import com.vimeo.networking.VimeoClient;
import com.vimeo.networking.callbacks.AuthCallback;
import com.vimeo.networking.callbacks.ModelCallback;
import com.vimeo.networking.model.Video;
import com.vimeo.networking.model.error.VimeoError;
public class MainActivity extends AppCompatActivity
{
private VimeoClient mApiClient = VimeoClient.getInstance();
private ProgressDialog mProgressDialog;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage("All of your API are belong to us...");
// ---- Client Credentials Auth ----
if (mApiClient.getVimeoAccount().getAccessToken() == null) {
// If there is no access token, fetch one on first app open
authenticateWithClientCredentials();
}
}
// You can't make any requests to the api without an access token. This will get you a basic
// "Client Credentials" gran which will allow you to make requests
private void authenticateWithClientCredentials() {
mProgressDialog.show();
mApiClient.authorizeWithClientCredentialsGrant(new AuthCallback() {
@Override
public void success()
{
Toast.makeText(MainActivity.this, "Client Credentials Authorization Success", Toast.LENGTH_SHORT).show();
mProgressDialog.hide();
mApiClient.fetchNetworkContent("https://vimeo.com/179708540", new ModelCallback<Video>(Video.class)
{
@Override
public void success(Video video)
{
// use the video
Log.d("VIDEO", "SUCCESS");
String html = video.embed != null ? video.embed.html : null;
if(html != null)
{
// html is in the form "<iframe .... ></iframe>"
// load the html, for instance, if using a WebView on Android, you can perform the following:
WebView webview = (WebView) findViewById(R.id.webView); // obtain a handle to your webview
webview.loadData(html, "text/html", "utf-8");
}
}
@Override
public void failure(VimeoError error)
{
Log.d("VIDEO", "FAIL");
Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_SHORT).show();
// voice the error
}
});
}
@Override
public void failure(VimeoError error) {
Toast.makeText(MainActivity.this, "Client Credentials Authorization Failure", Toast.LENGTH_SHORT).show();
mProgressDialog.hide();
}
});
}
}
Upvotes: 4
Views: 11286
Reputation: 367
I solved the issue by authenticating with simpler authentication
You can authenticate as per your choice for playing the link you can use my method in the link below by
I used Vimeo networking library which is the official library of vimeo
Here is the link to my answer I able to configure what URI should I use How to play the video by Video View or Exo Player
So, your solution is you can replace the code of native playback to embed code. The code for embed is here https://github.com/vimeo/vimeo-networking-java/tree/master#embed
Now replace the Native play code in my solution below to the embed code Android Play Vimeo Video // this is the solution
Upvotes: 0
Reputation: 11
You don't need any library to get vimeo video url
You need to follow just these two steps
Call this url with vimeo video ID to get the JSON Response.
Parse the JSON Response
JSONArray streamArray = new JSONObject(<JSON Response String>)
.getJSONObject("request")
.getJSONObject("files")
.getJSONArray("progressive");
//Get info for each stream available
for (int streamIndex = 0; streamIndex < streamArray.length(); streamIndex++)
{
JSONObject stream = streamArray.getJSONObject(streamIndex);
String url = stream.getString("url");
String quality = stream.getString("quality");
}
Upvotes: 1
Reputation: 628
Java Version: I used "Jack the Ripper" answer with little changes:
Step 1: Used below link to extract video path
https://github.com/ed-george/AndroidVimeoExtractor
Step 2: get Vimeo video path
private void initializePlayer() {
if(getIntent().getStringExtra("vimeo_vid_id")!=null){
vid_id = getIntent().getStringExtra("vimeo_vid_id");
}
VimeoExtractor.getInstance().fetchVideoWithIdentifier(vid_id, null, new OnVimeoExtractionListener() {
@Override
public void onSuccess(VimeoVideo video) {
String hdStream = video.getStreams().get("720p");
System.out.println("VIMEO VIDEO STREAM" + hdStream);
if (hdStream != null) {
playVideo(hdStream);
}
}
@Override
public void onFailure(Throwable throwable) {
}
});
}
Step 3: Play video in VideoView
private void playVideo(final String stream) {
runOnUiThread(new Runnable() {
@Override
public void run() {
final VideoView videoView = findViewById(R.id.vimeo_vv);
final MediaController mediacontroller = new MediaController(VimeoVideoActivity.this);
mediacontroller.setAnchorView(videoView);
videoView.setMediaController(mediacontroller);
videoView.setBackgroundColor(Color.TRANSPARENT);
Uri video = Uri.parse(stream);
videoView.setVideoURI(video);
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
videoView.requestFocus();
videoView.start();
}
});
videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
System.out.println("Video Finish");
finish();
}
});
}
});
}
Upvotes: 4
Reputation: 6080
You can achive this by using external library VimeoExtractor. (my example in kotlin) https://github.com/ed-george/AndroidVimeoExtractor
1. Step one.
Add lib to gradle.
2. Step Two - get stream url
private fun initializePlayer() {
progressBar.visible() //optional show user that video is loading.
VimeoExtractor.getInstance().fetchVideoWithURL(VIMEO_VIDEO_URL, null, object : OnVimeoExtractionListener {
override fun onSuccess(video: VimeoVideo) {
val videoStream = video.streams["720p"] //get 720p or whatever
videoStream?.let{
playVideo(videoStream)
}
}
override fun onFailure(throwable: Throwable) {
Timber.e("Error durning video stream fetch")
}
})
}
3. Step three - play when ready
fun playVideo(videoStream: String) {
runOnUiThread {
progressBar.gone() //hide progressBar
videoView.setBackgroundResource(R.drawable.splash_backgorund)
videoView.setVideoPath(videoStream)
videoView.requestFocus()
videoView.setOnPreparedListener { mp ->
mp.isLooping = true
videoView.start()
}
}
}
Upvotes: 6
Reputation: 333
The problem is that you are trying to use a url and the vimeo-networking library is expecting a uri.
The url you have is https://vimeo.com/179708540
- this is a web url to see a video on the Vimeo site. To use the vimeo-networking library you must provide a uri to the method you are using (in this case fetchNetworkContent
); for the video in this question the uri would look like /videos/179708540
. The vimeo-networking library will then use this uri to construct a url for connection with the Vimeo API - it will end up looking like https://api.vimeo.com/videos/179708540
.
Upvotes: 3