java - 制作安卓电视启动器应用程序需要什么
问题描述
我找不到任何关于如何为安卓电视制作启动器应用程序的教程。所以我拍了一段视频,展示了制作一个手机启动器应用程序。这是视频。
但是我没有完全复制视频中的代码,因为我知道 android 电视应用程序所需的依赖项和库。主要问题是我的电视模拟器没有显示更改启动器的选项。在20:19显示的视频中,模拟器打开后,按下主页按钮会询问要使用哪个启动器,但按下主页按钮后我没有收到任何此类对话框,我也没有收到任何错误,所以我我几乎被困在这里。
应用程序默认不会启动任何活动
这是代码:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tvapp.myapplication">
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<uses-feature
android:name="android.software.leanback"
android:required="true" />
<application
android:allowBackup="true"
android:banner="@drawable/banner"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication">
<activity
android:name=".AppListActivity"
android:exported="true">
<intent-filter>
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTask"
android:stateNotNeeded="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
主题.xml
<resources>
<style name="Theme.MyApplication" parent="@style/Theme.Leanback.Browse" />
</resources>
主要活动
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = findViewById(R.id.button);
btn.setOnClickListener(view -> {
Intent intent = new Intent(getApplicationContext(), AppListActivity.class);
startActivity(intent);
});
}
@Override
public void onBackPressed() {
// do nothing
}
}
应用列表活动
public class AppListActivity extends FragmentActivity {
private PackageManager manager;
private List<Item> apps;
private ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_app_list);
loadApps();
loadListView();
addClickListener();
}
private void loadApps() {
manager = getPackageManager();
apps = new ArrayList<>();
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LEANBACK_LAUNCHER);
List<ResolveInfo> availableActivities = manager.queryIntentActivities(intent, 0);
for(ResolveInfo ri : availableActivities) {
Item app = new Item();
app.label = ri.activityInfo.packageName;
app.name = ri.loadLabel(manager);
app.icon = ri.loadIcon(manager);
apps.add(app);
}
}
private void loadListView() {
list = findViewById(R.id.list);
ArrayAdapter<Item> adapter = new ArrayAdapter<Item>(this, R.layout.item, apps) {
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent)
{
if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.item, null);
}
ImageView appIcon = convertView.findViewById(R.id.icon);
appIcon.setImageDrawable(apps.get(position).icon);
TextView appName = convertView.findViewById(R.id.name);
appName.setText(apps.get(position).name);
return convertView;
}
};
list.setAdapter(adapter);
}
private void addClickListener() {
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = manager.getLaunchIntentForPackage(apps.get(position).label.toString());
startActivity(intent);
}
});
}
}
项目.java
public class Item {
CharSequence label;
CharSequence name;
Drawable icon;
}
主要活动布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="APPS" />
</RelativeLayout>
AppListActivity 布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".AppListActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/list"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:background="#ffffff">
</ListView>
</LinearLayout>
项目布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="10dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/icon"
android:scaleType="centerInside" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/name"
android:layout_marginTop="10dp"
android:textSize="18sp" />
</LinearLayout>
解决方案
和类别应该在意图过滤android.intent.category.HOME
器(具有LEANBACK_LAUNCHER)中,以表明您的应用是电视设备的启动器。.DEFAULT
AppListActivity
推荐阅读
- reactjs - 在 BrowserRouter 更改后反应动态路由不起作用
- reactjs - 图像未在 React 中加载,也没有错误
- three.js - Threejs与不透明度混合
- python - 在线法官给出错误答案
- python-3.x - 使用 Pandas 读取 excel 文件时如何避免“不支持的文件格式”错误
- azure - 我可以在 Azure 警报自定义负载中包含 alertId
- powerbi - 使用 PowerBI (DAX) 计算经常性客户,得到计算错误
- azure-active-directory - Microsoft Intune 如何更改设置(例如密码策略)以保持注册表值不变?
- c# - 批量插入时ADO.net服务器超时,如何改进?
- amazon-web-services - 爬虫如何比直接连接到数据库和检索数据好得多?