GVKun编程网logo

Chrome To Phone 2.0 将你浏览器中的内容实时发送到 Android 手机上(谷歌浏览器发送到设备)

1

针对ChromeToPhone2.0将你浏览器中的内容实时发送到Android手机上和谷歌浏览器发送到设备这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展1.cocos2dx记忆卡片游戏代码

针对Chrome To Phone 2.0 将你浏览器中的内容实时发送到 Android 手机上谷歌浏览器发送到设备这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展1.cocos2dx记忆卡片游戏代码、并将游戏移植到“华为荣耀”手机上、移植中的问题总结、Android 权限适配,在VIVO和OPPO 手机上,Android 7及以下设备无法读取权限、Chrome 开发者工具,不能更改窗口大小,怎么破?(Google Chrome、国内 Chrome 包装浏览器都不可以)、Chrome 扩展 - 如何使用 manifest v3 访问本地 file:// 解决方法:文件系统 API,Chrome 88-90解决方案 1. 扩展框架,Chrome 91+解决方案 2. 扩展窗口/选项卡,Chrome 91+注意事项等相关知识,希望可以帮助到你。

本文目录一览:

Chrome To Phone 2.0 将你浏览器中的内容实时发送到 Android 手机上(谷歌浏览器发送到设备)

Chrome To Phone 2.0 将你浏览器中的内容实时发送到 Android 手机上(谷歌浏览器发送到设备)

8月12日上午10点,Google 在其 Mountain View 总部召开了移动产品发布会,会上发布了 Chrome To Phone 这个在今年 Google I/O 上演示过的强大功能的最新版本。

Chrome To Phone 2.0 仍旧是由一个 Chrome 扩展和一个 Android 应用程序组成,他的功能远不止我们介绍过的 1.7 中发送一个链接这么简单,在今天的演示会上,我们看到 Chrome To Phone 2.0 可以:

  • 推送 YouTube 连接到手机上,手机上的 YouTube 应用程序将自动启动加载该视频
  • 推送一个地址到手机上,手机上的 Google Maps 导航程序会自动启动,并将该地址设为目的地
  • 在浏览器中选中一个电话号码,点击扩展图标,andoird 手机会自动拨叫此号码

还有更多的功能,大家自己体验吧,点击这里安装 Chrome to Phone 的 Chrome 扩展,在 Android Market 搜索 Chrome to Phone 安装手机端应用(仍旧只支持 Android 2.2 Froyo)。

另外,Chrome to Phone 是完全开源的,也就是说我们很快就会看到 Firefox 以及 Safari 上可用的扩展。还有一个非常有意思的细节,在产品发布会的问答环节中,有人提问会不会有 Chrome to iPhone?Google 员工的回答非常耐人寻味:We''re looking at it.

点击继续观看 Chrome To Phone 2.0 演示视频。

点击这里查看原始视频。

via googlemobile

1.cocos2dx记忆卡片游戏代码、并将游戏移植到“华为荣耀”手机上、移植中的问题总结

1.cocos2dx记忆卡片游戏代码、并将游戏移植到“华为荣耀”手机上、移植中的问题总结



1记忆卡片游戏代码

CardItem.h

#pragmaonce

#ifndef__CardItem_H__

#define__CardItem_H__

#include"cocos2d.h"

USING_NS_CC;

classCardItem :publicCCSprite

{

public:

staticCardItem *create(intidx);

boolinit(intidx);

cclabelTTF *ttf;

CCSprite *bg;

CC_SYNTHESIZE(int,_index,Idx);

voidshowWhite();

voidshowtext();

};

#endif

CardItem.cpp

#include"CardItem.h"

CardItem *CardItem::create(intidx)

{

CardItem *pRet =newCardItem;

if (pRet &&pRet->init(idx))

{

pRet->autorelease();

}

else

{

deletepRet;

pRet =NULL;

}

returnpRet;

}

boolCardItem::init(intidx)

{

CCSprite::init();

setIdx(idx);

setContentSize(CCSizeMake(80,80));

setAnchorPoint(ccp(0,0));

//设置字体

CCString *str =CCString::createWithFormat("%d",idx);

ttf =cclabelTTF::create(str->getCString(),"Courier New",50);

ttf->setPosition(ccp(40,40));

this->addChild(ttf);

bg =CCSprite::create();

bg->setTextureRect(CCRectMake(0,77,77));

bg->setAnchorPoint(ccp(0,0));

bg->setColor(ccc3(255,255,255));

this->addChild(bg);

returntrue;

}

voidCardItem::showWhite()

{

ttf->setVisible(false);

bg->setVisible(true);

}

voidCardItem::showtext()

{

ttf->setVisible(true);

bg->setVisible(false);

}

LayerGame.h

#ifndef__LayerGame_H__

#define__LayerGame_H__

#include"cocos2d.h"

#include"vector"

usingnamespacestd;

USING_NS_CC;

classLayerGame :publiccclayer

{

public:

staticCCScene *scene(intdegree);

staticLayerGame *create(intdegree);

boolinit(intdegree);

voidgetAllPoint();

voidgetAvailablePoint();

voidaddCard();

voidshowCardAllWhite();

CCPointArray *allPoints;

CCArray*allCards;

vector<int>vec;

CC_SYNTHESIZE(int,_degere,Degree);

CC_SYNTHESIZE(int,_clickStart,ClickStart);

virtualboolccTouchBegan(CCTouch *pTouch,CCEvent *pEvent);

};

#endif

LayerGame.cpp

#include"LayerGame.h"

#include"CardItem.h"

#include"stdlib.h"

#include"time.h"

#include"LayerOver.h"

#include"cocos-ext.h"//支持声音的

#include"SimpleAudioEngine.h"

usingnamespaceCocosDenshion;

USING_NS_CC_EXT;//放开扩展库

CCScene *LayerGame::scene(intdegree)

{

CCScene *scene =CCScene::create();

LayerGame *layer =LayerGame::create(degree);

scene->addChild(layer);

returnscene;

}

LayerGame *LayerGame::create(intdegree)

{

LayerGame *pRet =newLayerGame;

if (pRet &&pRet->init(degree))

{

pRet->autorelease();

}

else

{

deletepRet;

pRet =NULL;

}

returnpRet;

}

boolLayerGame::init(intdegree)

{

cclayer::init();

setDegree(degree);

setClickStart(0);

getAllPoint();

getAvailablePoint();

addCard();

setTouchEnabled(true);

setTouchMode(kCCtouchesOneByOne);

SimpleAudioEngine::sharedEngine()->preloadEffect("boom.mp3");

returntrue;

}

voidLayerGame::getAllPoint()

{

allPoints =CCPointArray::create(60);

allPoints->retain();

for (inti = 0;i < 10;i++)

{

for (intj = 0;j < 6;j++)

{

allPoints->addControlPoint(ccp(80 * i,80 *j));

}

}

}

//获得要作为游戏点的point

voidLayerGame::getAvailablePoint()

{

srand(time(NULL));

while (1)

{

intidx =rand() % 60;

vector<int>::iteratoritr =vec.begin();

for (;itr !=vec.end(); ++itr)

{

if (*itr ==idx)

break;

}

if (itr ==vec.end())

{

vec.push_back(idx);

if (vec.size() == getDegree())

break;

}

}

}

voidLayerGame::addCard()

{

allCards =CCArray::create();

allCards->retain();

for (inti = 0;i <getDegree();i++)

{

CardItem *item =CardItem::create(i);

item->setPosition((CCPoint)allPoints->getControlPointAtIndex(vec[i]));

addChild(item);

item->showtext();

allCards->addobject(item);

}

}

voidLayerGame::showCardAllWhite()

{

CCObject *obj;

CCARRAY_FOREACH(allCards,obj)

{

CardItem *spr = (CardItem *)obj;

spr->showWhite();

}

}

boolLayerGame::ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent)

{

for (inti = 0;i <allCards->count();i++)

{

//判断是否点中

if (((CardItem*)allCards->objectAtIndex(i))->boundingBox().

containsPoint(pTouch->getLocation()))

{

showCardAllWhite();

SimpleAudioEngine::sharedEngine()->playEffect("boom.mp3");

if (getClickStart() == ((CardItem*)allCards->objectAtIndex(i))->getIdx())

{

((CardItem*)allCards->objectAtIndex(i))->removeFromParentAndCleanup(true);

allCards->removeObjectAtIndex(i);

if (allCards->count() == 0)

{

CCScene *scene =LayerOver::scene(true);

CCDirector::sharedDirector()->replaceScene(scene);

cclog("you win game");

}

}

else

{

CCScene *scene =LayerOver::scene(false);

CCDirector::sharedDirector()->replaceScene(scene);

cclog("you lose game");

}

_clickStart++;

}

}

returntrue;

}

LayerOver.h

#ifndef__LayerOver_H__

#define__LayerOver_H__

#include"cocos2d.h"

USING_NS_CC;

classLayerOver :publiccclayer

{

public:

staticCCScene *scene(boolres);

staticLayerOver*create(boolres);

boolinit(boolres);

voidmenuCallBack(CCObject * obj);

};

#endif

LayerOver.cpp

#include"LayerOver.h"

#include"LayerStart.h"

CCScene *LayerOver::scene(boolres)

{

CCScene *scene =CCScene::create();

LayerOver *layer =LayerOver::create(res);

scene->addChild(layer);

returnscene;

}

LayerOver*LayerOver::create(boolres)

{

LayerOver *pRet =newLayerOver();

if (pRet &&pRet->init(res))

{

pRet->autorelease();

}

else

{

deletepRet;

pRet =NULL;

}

returnpRet;

}

boolLayerOver::init(boolres)

{

cclayer::init();

Ccmenu *menu =Ccmenu::create();

CcmenuItem *back =CcmenuItemFont::create("Back",this,menu_selector(LayerOver::menuCallBack));

if (res ==true)

{

CcmenuItem *winItem =CcmenuItemFont::create("You Win");

menu->addChild(winItem);

menu->addChild(back);

}

else

{

CcmenuItem *failItem =CcmenuItemFont::create("You Failed");

menu->addChild(failItem);

menu->addChild(back);

}

addChild(menu);

menu->alignItemsverticallyWithPadding(30);

returntrue;

}

voidLayerOver::menuCallBack(CCObject *obj)

{

CCScene *scene =LayerStart::scene();

CCDirector::sharedDirector()->replaceScene(scene);

}

LayerStart.h

#ifndef__LayerStart_H__

#define__LayerStart_H__

#include"cocos2d.h"

USING_NS_CC;

classLayerStart :publiccclayer

{

public:

CREATE_FUNC(LayerStart);

staticCCScene *scene();

boolinit();

voideasy(CCObject * obj);

voidhard(CCObject * obj);

voidveryHard(CCObject * obj);

voidquit(CCObject * obj);

enumDEGREE

{

EASY = 5,HARD = 7,VERYHARD = 9

};

};

#endif

LayerStart.cpp

#include"LayerStart.h"

#include"LayerGame.h"

CCScene *LayerStart::scene()

{

CCScene *scene =CCScene::create();

LayerStart *layer =LayerStart::create();

scene->addChild(layer);

returnscene;

}

boolLayerStart::init()

{

cclayer::init();

CcmenuItem *easyItem =CcmenuItemFont::create("Easy",

menu_selector(LayerStart::easy));

CcmenuItem *hardItem =CcmenuItemFont::create("Hard",

menu_selector(LayerStart::hard));

CcmenuItem *veryHardItem =CcmenuItemFont::create("VeryHard",

this,menu_selector(LayerStart::veryHard));

CcmenuItem *quitItem =CcmenuItemFont::create("Quit",

menu_selector(LayerStart::quit));

Ccmenu *menu =Ccmenu::create(easyItem,hardItem,veryHardItem,quitItem,NULL);

menu->alignItemsverticallyWithPadding(30);

addChild(menu);

returntrue;

}

voidLayerStart::easy(CCObject * obj)

{

CCScene *scene =LayerGame::scene(EASY);

CCDirector::sharedDirector()->replaceScene(scene);

}

voidLayerStart::hard(CCObject * obj)

{

CCScene *scene =LayerGame::scene(HARD);

CCDirector::sharedDirector()->replaceScene(scene);

}

voidLayerStart::veryHard(CCObject * obj)

{

CCScene *scene =LayerGame::scene(VERYHARD);

CCDirector::sharedDirector()->replaceScene(scene);

}

voidLayerStart::quit(CCObject * obj) {

exit(1);

}

运行结果:

点击进入Easy后的效果:

失败后的效果:

2记忆卡片手机移植

环境准备:所需软件:

32位:

64

软件安装(注意不要有中文目录)

1.安装JDK

@H_301_6194@jdk-7u25-windows-i586.exe

2.安装安卓SDK

@H_301_6194@

3.安装安装NDK

@H_301_6194@

4.打开(F:\TransPlant\adt-bundle-windows-x86-20140321\eclipse\eclipse.exe):

@H_301_6194@

效果图如下:

game游戏项目导入,导入录入路径:E:\Installed\cocos2d-x-2.2.3\projects\game\proj.android

点击:File -- >Import

运行结果:

5安装cygin,从官网(http://cygwin.com/install.html)上下载cygwin.

下载后软件:

A双击上面的64位或者32位的软件进行安装。这里选择64位进行安装。

配置cygwin.

A修改:cygwin64\etc中的fstab,将最后一行注释掉,而换成如下的配置:

none /cygdrive cygdrive binary,noacl,posix=0,user 0 0

左面cygwin的运行效果图如下:

6配置环境变量

Cygwin加载系统路径到Eclipse本地路径中。解决bash找不到的问题,打开Eclipse->windows-preference看到如下配置:

7修改Androidmakefile

8配置项目中的build_native.sh文件,加上:

chmod 777 "$APP_ANDROID_ROOT"/assets -R

9导入cocos2dx的另外一个Android应用,只有这样才能让本项目运行起来

加载路径是:E:\Installed\cocos2d-x-2.2.3\cocos2dx\platform\android\java

点击确定。导入后的截图:

8将游戏移植到手机,将手机USB线接上电脑(注意,不要使用Android模拟器进行运行,cocos2dxAndroid模拟器上运行由问题)。

右击game项目Android项目进行run(这里以华为荣耀作为测试机)。

运行效果:

从下面game即使移植到华为荣耀手机上的cocos2d-x记忆卡片游戏


打开bin,拷贝bak文件即可用:



7横屏、竖屏设置

androidAndroidManifest.xml文件中:

screenorientation="landscape"为横屏,

screenorientation="portrait"为竖屏

移植错误总结:

[2014-10-23 17:11:41 - myhello] Unable to resolve target 'android-8'

[2014-10-23 17:24:58 - libcocos2dx] Unable to resolve target 'android-8'

[2014-10-23 17:33:15 - SDK Manager] Created AVD 'AVD19' based on Android 4.4.2,ARM (armeabi-v7a) processor,

[2014-10-23 17:33:15 - SDK Manager] with the following hardware config:

[2014-10-23 17:33:15 - SDK Manager] disk.dataPartition.size=200M

[2014-10-23 17:33:15 - SDK Manager] hw.accelerometer=yes

[2014-10-23 17:33:15 - SDK Manager] hw.audioInput=yes

[2014-10-23 17:33:15 - SDK Manager] hw.battery=yes

[2014-10-23 17:33:15 - SDK Manager] hw.camera.back=none

[2014-10-23 17:33:15 - SDK Manager] hw.dPad=no

[2014-10-23 17:33:15 - SDK Manager] hw.device.hash2=MD5:b1157894a81a9869f18a16ee4591a709

[2014-10-23 17:33:15 - SDK Manager] hw.device.manufacturer=Generic

[2014-10-23 17:33:15 - SDK Manager] hw.device.name=3.2in HVGA slider (ADP1)

[2014-10-23 17:33:15 - SDK Manager] hw.gps=yes

[2014-10-23 17:33:15 - SDK Manager] hw.keyboard=yes

[2014-10-23 17:33:15 - SDK Manager] hw.keyboard.lid=yes

[2014-10-23 17:33:15 - SDK Manager] hw.lcd.density=160

[2014-10-23 17:33:15 - SDK Manager] hw.mainKeys=yes

[2014-10-23 17:33:15 - SDK Manager] hw.ramSize=512

[2014-10-23 17:33:15 - SDK Manager] hw.sdCard=yes

[2014-10-23 17:33:15 - SDK Manager] hw.sensors.orientation=yes

[2014-10-23 17:33:15 - SDK Manager] hw.sensors.proximity=yes

[2014-10-23 17:33:15 - SDK Manager] hw.trackball=no

[2014-10-23 17:33:15 - SDK Manager] skin.dynamic=no

[2014-10-23 17:33:15 - SDK Manager] vm.heapSize=16

[2014-10-23 17:35:56 - myhello](skipping file '.gitignore' due to ANDROID_AAPT_IGnorE pattern '.*')

[2014-10-23 17:35:56 - myhello]Unable to add 'F:\cocos2d-x-2.2.3\cocos2d-x-2.2.3\projects\myhello\proj.android\assets\Closenormal.png': Zip add Failed

[2014-10-23 17:35:56 - myhello] ERROR: unable to process assets while packaging 'F:\cocos2d-x-2.2.3\cocos2d-x-2.2.3\projects\myhello\proj.android\bin\resources.ap_'

[2014-10-23 17:35:56 - myhello] ERROR: packaging of 'F:\cocos2d-x-2.2.3\cocos2d-x-2.2.3\projects\myhello\proj.android\bin\resources.ap_' Failed

上面的错误原因是:

要修改:cygwin64\etc中的fstab,user 0 0

其它问题:略



Android 权限适配,在VIVO和OPPO 手机上,Android 7及以下设备无法读取权限

Android 权限适配,在VIVO和OPPO 手机上,Android 7及以下设备无法读取权限

Android 权限适配,在VIVO和OPPO 手机上,Android 7及以下设备无法读取权限

Chrome 开发者工具,不能更改窗口大小,怎么破?(Google Chrome、国内 Chrome 包装浏览器都不可以)

Chrome 开发者工具,不能更改窗口大小,怎么破?(Google Chrome、国内 Chrome 包装浏览器都不可以)

平时在开发中,经常将“Chrome 开发者工具”拉高拉低查看信息,突然间“开发者工具”成了固定大小,1/3 窗口高度,不能调整。

Chrome 版本:77.0.3865.90

尝试方法:

1、卸载 Chrome 浏览器重试,仍不能调整大小。
2、安装国内 Chrome 内核浏览器,其开发者工具仍不能调整大小。

问:Chrome 的配置文件究竟在哪,总不至于重装系统吧?

Chrome 扩展 - 如何使用 manifest v3 访问本地 file:// 解决方法:文件系统 API,Chrome 88-90解决方案 1. 扩展框架,Chrome 91+解决方案 2. 扩展窗口/选项卡,Chrome 91+注意事项

Chrome 扩展 - 如何使用 manifest v3 访问本地 file:// 解决方法:文件系统 API,Chrome 88-90解决方案 1. 扩展框架,Chrome 91+解决方案 2. 扩展窗口/选项卡,Chrome 91+注意事项

如何解决Chrome 扩展 - 如何使用 manifest v3 访问本地 file:// 解决方法:文件系统 API,Chrome 88-90解决方案 1. 扩展框架,Chrome 91+解决方案 2. 扩展窗口/选项卡,Chrome 91+注意事项

我有一个 Chrome 扩展程序,它可以(如果您允许访问文件 URL)抓取您在 chrome 中打开的本地 pdf 文件,并将其发送到我们的 API 进行处理。这是通过从后台脚本中获取带有 XMLHttpRequestfile:///Users/user/whatever/testfile.pdf 的 pdf 来完成的。

当为 Chrome 扩展程序迁移到 manifest v3 时,后台脚本将成为服务工作者。在 Service Worker 中,只有 fetch 可用,而不是 XMLHttpRequest。问题是,fetch 只支持 http 和 https,不支持 file:// url。那么,我如何才能实现让 Chrome 扩展程序获取/获取本地文件的相同功能?

编辑:我也尝试过的事情:

  1. 按照回答的建议从注入的 iframe 中创建 XMLHttpRequest。 发出请求时会出现错误 net:ERR_UNKNowN_URL_SCHEME

  2. 从注入的内容脚本生成 XMLHttpRequest。 这给出了错误 Access to XMLHttpRequest at ''file:///.../testfile1.docx.pdf'' from origin ''null'' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http,data,chrome,chrome-extension,chrome-untrusted,https.

据我从大量研究中了解到,对 file:// 的访问通常被阻止,Chrome 扩展程序后台脚本曾经是一个例外。在我看来,内容脚本或操作弹出窗口从未允许这样做。

我的 manifest.json 供参考:

{
  "manifest_version": 3,"name": "..","version": "0.1","icons": {
    "16": "assets/icon-16x16.png","48": "assets/icon-48x48.png","128": "assets/icon-128x128.png"
  },"action": {
    "default_title": ".."
  },"background": {
    "service_worker": "background.js"
  },"permissions": [
    "webRequest","activeTab","scripting","storage","unlimitedStorage","identity","pageCapture"
  ],"host_permissions": [
    "<all_urls>"
  ],"web_accessible_resources": [{
    "resources": ["iframe.html"],"matches": [],"extension_ids": []
  }]
}

以编程方式注入内容脚本(使用 webextension-polyfill 进行 promise 支持)

browser.action.onClicked.addListener(async (tab: Tab) => {
  await browser.scripting.executeScript({files: [ "inject.js" ],target: {tabId: tab.id}});
});

解决方法

由于您已经提到的原因,您无法在后台 Service Worker 中执行此操作。还有一个 bug 阻止在正常可见的 chrome-extension:// 页面或 iframe 中执行此操作。它已在 Chrome 91 中修复。

解决方法:文件系统 API,Chrome 88-90

ManifestV3 扩展可以使用新的 File System API 来读取文件的内容,例如在通过 web_accessible_resources 公开的 iframe 内。

解决方案 1. 扩展框架,Chrome 91+

使用在带有该 pdf 的选项卡中运行的内容脚本:

    manifest.json 中的
  1. matches 应该包含 <all_urls>file://*/* 并且文件访问应该由用户在 chrome://extensions 扩展程序的 UI。或者你可以使用 activeTab 权限和 programmatic injection 当用户 单击您的扩展程序的图标或通过上下文菜单调用它。
  2. 内容脚本添加了一个不可见的 iframe,指向 web_accessible_resources 中公开的 iframe.html 文件
  3. iframe.html 加载 iframe.js,它照常使用 XMLHttpRequest。由于 iframe 具有 chrome-extension:// URL,因此它的环境 与旧的后台脚本相同,因此您可以执行所有操作 你之前在那里做过。

解决方案 2. 扩展窗口/选项卡,Chrome 91+

另一种解决方案是使用您的任何其他可见页面 扩展程序,如 action 弹出窗口或选项页面或任何其他 chrome-extension:// 属于您的扩展程序的页面,因为它们可以 只需访问 file:// 网址 就像您之前在后台脚本中所做的那样。

注意事项

  • 应该在 chrome://extensions 页面中为此扩展程序启用文件访问。

关于Chrome To Phone 2.0 将你浏览器中的内容实时发送到 Android 手机上谷歌浏览器发送到设备的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于1.cocos2dx记忆卡片游戏代码、并将游戏移植到“华为荣耀”手机上、移植中的问题总结、Android 权限适配,在VIVO和OPPO 手机上,Android 7及以下设备无法读取权限、Chrome 开发者工具,不能更改窗口大小,怎么破?(Google Chrome、国内 Chrome 包装浏览器都不可以)、Chrome 扩展 - 如何使用 manifest v3 访问本地 file:// 解决方法:文件系统 API,Chrome 88-90解决方案 1. 扩展框架,Chrome 91+解决方案 2. 扩展窗口/选项卡,Chrome 91+注意事项等相关内容,可以在本站寻找。

本文标签: