应在我的应用程序中进行哪些更改(其中没有广告)以避免违反 YouTube API 服务条款?

What to change in my app (no AD within it) to avoid violation of the YouTube API Terms of Service?

我有一个基本的儿童应用程序,允许他们点击图标执行 YouTube 搜索 (link to amazon app store)。

虽然我对应用程序做了很多更改,但它已从 Google Play 商店中删除 "violation of the YouTube Terms of Service or YouTube API Terms of Service"(全文附在下面)。

我在这里做了一项研究,似乎我的应用程序没有我在其他应用程序中看到的问题。该应用程序没有广告,我认为它不会干扰 youtube 广告,也不会在后台播放视频。

此外,我向 Google Play 提出了申诉。他们的回应是我的应用程序从 YouTube 流式传输受版权保护的内容。我搜索了卡通片,所以我将其删除并重新提交,但该应用程序因同样的原因再次被拒绝。 当我寻求进一步帮助时,他们回答:"Unfortunately, as much as we'd like to help, we aren't able to provide additional information for your inquiry"。非常令人沮丧。

非常感谢你的帮助。也许我在实现YoutubePlayer的代码中犯了一个错误,欢迎提出其他想法。

来自Google播放的完整通知:

这是一条通知,您的程序包 ID com.elelad.kidstube 的应用程序 KidoTube 已从 Google Play 中删除。

请解决下述问题并提交合规更新。一旦获得批准,您的应用程序将再次可用,并且所有安装、评级和评论都完好无损。

开发者分发协议第 4.4 节 REMOVAL:Violation 的原因。

经过定期审核,我们确定您的应用下载、获利或以其他方式访问 YouTube 视频的行为违反了 YouTube 服务条款或 YouTube API 服务条款。以未经授权的方式访问内容、产品或服务违反了开发者分发协议,Google Play 不允许这样做。

跟踪所有删除。重复删除将导致应用暂停,此时此应用将被视为对您开发者帐户信誉的打击,并且不再在 Google Play 上可用。

此通知还用作您目录中其他应用程序的通知。您可以立即确保目录中没有其他应用违反(但不限于)上述政策,从而避免将来删除 and/or 应用暂停。在发布应用程序之前,请确保您的应用程序符合开发者分发协议和内容政策。

如果您认为我们的决定有误,您可以访问这篇 Google Play 帮助中心文章。

Google 游戏团队

我的 YoutubeActivity Class:

public class YoutubeActivity extends YouTubeBaseActivity implements YouTubePlayer.OnInitializedListener {

private final static String TAG = YoutubeActivity.class.getSimpleName();
YouTubePlayer player;
public static String YOUTUBE_VIDEO_ID = null;
LayoutInflater mLayoutInflater;
private FragmentActivity myContext;
public TextView textToast;
public View toastLayout;
ProgressBar cycleProgressBar;
Search search = new Search();
List<Video> mVideoList;
private static boolean initialize = false;
GetRandomInBackground getRandomInBackground;
YouTubePlayerView youTubePlayer;
ImageView waitLogo;
AnimationDrawable frameAnimation2;
ImageButton play;


public static void setYoutubeVideoId(String youtubeVideoId) {
    YOUTUBE_VIDEO_ID = youtubeVideoId;
}


@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);}
}

@Override
public void onCreate(Bundle savedInstanseState) {
    super.onCreate(savedInstanseState);
    ContentResolver mContentResolver = getContentResolver();
    setContentView(R.layout.youtube_player);
    waitLogo = (ImageView) findViewById(R.id.player_logo);
    play = (ImageButton) findViewById(R.id.play);
    try {
        startLogoAnimation();
    }catch (Exception e){
        waitLogo.setImageResource(R.mipmap.kidotube);
    }
            youTubePlayer = (YouTubePlayerView) findViewById(R.id.vYouTubePlayer);
    if (Setting.isStartRandomVideo()) {
        getRandomInBackground = new GetRandomInBackground();
        getRandomInBackground.execute();
    }
    youTubePlayer.initialize(Search.getGoogleApiKey(), this);
    youTubePlayer.setVisibility(View.INVISIBLE);
}

@Override
protected void onPause() {
    super.onPause();
    BaseActivity.myLifecycleHandler.onActivityPaused(this);
}

@Override
protected void onResume() {
    super.onResume();
    BaseActivity.myLifecycleHandler.onActivityResumed(this);
}

@Override
public void onInitializationFailure(YouTubePlayer.Provider provider,
                                    YouTubeInitializationResult result) {
    Toast.makeText(this, "Cant initialize YouTube Player", Toast.LENGTH_LONG).show();
    finish();
}


@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer mplayer,
                                    boolean wasRestored) {
    this.player = mplayer;
    player.setPlayerStyle(YouTubePlayer.PlayerStyle.CHROMELESS);
    player.setPlayerStateChangeListener(playerStateChanageListener);
    player.setPlaybackEventListener(playBackEvaentListener);
    if (!Setting.isStartRandomVideo()) {
        player.loadVideo(YOUTUBE_VIDEO_ID);
    }

}

private YouTubePlayer.PlaybackEventListener playBackEvaentListener = new YouTubePlayer.PlaybackEventListener() {

    public void onBuffering(boolean arg0) {
        Log.v(TAG, "onBuffering");
    }

    @Override
    public void onPaused() {
        Log.v(TAG, "onPaused");
    }

    @Override
    public void onPlaying() {
        Log.v(TAG, "onPlaying");

    }

    @Override
    public void onSeekTo(int arg0) {
        Log.v(TAG, "onSeekTo");
    }

    @Override
    public void onStopped() {
        Log.v(TAG, "onStopped");
    }

};

private YouTubePlayer.PlayerStateChangeListener playerStateChanageListener = new YouTubePlayer.PlayerStateChangeListener() {
    @Override
    public void onAdStarted() {
    }

    @Override
    public void onError(YouTubePlayer.ErrorReason arg0) {
        Log.v(TAG, "onError" );
        Toast.makeText(YoutubeActivity.this, getString(R.string.Video_Error), Toast.LENGTH_LONG).show();
        finish();
    }

    @Override
    public void onLoaded(String arg0) {
        Log.v(TAG, "onLoaded" + arg0);
    }

    @Override
    public void onLoading() {
        Log.v(TAG, "onLoading" );
    }

    @Override
    public void onVideoEnded() {
        Log.v(TAG, "onVideoEnded" );
        finish();
    }

    @Override
    public void onVideoStarted() {
        Log.v(TAG, "onVideoStarted");
        play.setVisibility(View.INVISIBLE);
        waitLogo.setVisibility(View.INVISIBLE);
        frameAnimation2.stop();
        youTubePlayer.setVisibility(View.VISIBLE);
    }

};

public class GetRandomInBackground extends AsyncTask<Void, Void, Void> {


    @Override
    protected Void doInBackground(Void... params) {
        search.SearchNow(MainActivity.getSearchFor());
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        try {
            if (search.getVideoList() == null || search.getVideoList().size() == 0) {
                Toast.makeText(YoutubeActivity.this, getString(R.string.No_results_found), Toast.LENGTH_LONG).show();
                Intent intent = new Intent(YoutubeActivity.this, MainActivity.class);
                startActivity(intent);
            } else {
                mVideoList = search.getVideoList();
                setYoutubeVideoId(search.playRand(mVideoList));
                player.loadVideo(YOUTUBE_VIDEO_ID);
                Search.setNumberOfVideosReturned(20);
            }
        }catch (Exception e){
            finish();
        }
    }
}

public void startLogoAnimation(){
    waitLogo.setBackgroundResource(R.drawable.wait_icon);
    frameAnimation2 = (AnimationDrawable) waitLogo
            .getBackground();
    frameAnimation2.start();
}

public int animationDuration(AnimationDrawable animationDrawable){
    int duration = 0;
    int frames = animationDrawable.getNumberOfFrames();
    for (int i = 0; i<frames; i++){
        duration = duration + animationDrawable.getDuration(i);
    }
    return duration;
}

提前致谢!

嗯,这是我的设置之一。 我选择了点击图标并随机播放视频的选项,显然这违反了 API 条款。 当我删除该选项时,申请获得批准。

希望就这样结束了..