2012-10-11 30 views
10

Tôi đã tìm kiếm tất cả các ví dụ cụ thể về điều này và không thể tìm thấy nó trực tuyến ở bất cứ đâu.Làm cách nào để chuyển sang xem trước hình nền động từ ứng dụng?

Điều tôi muốn làm là: Từ ứng dụng của tôi, nhấp vào nút và chuyển sang xem trước hình nền động của ứng dụng hình nền sống của tôi, vì vậy người dùng có thể chọn kích hoạt nó.

Bây giờ những gì tôi đã đọc trực tuyến, tôi đang sử dụng WallpaperManager's ACTION_CHANGE_LIVE_WALLPAPER với EXTRA_LIVE_WALLPAPER_COMPONENT trỏ đến LiveWallpapers ComponentName của tôi.

Đây là mã của tôi về những gì tôi có cho đến thời điểm này. Có ai biết tôi đang làm gì sai không? Hiện tại tôi nhấp vào nút và không có gì xảy ra ... (Tôi đã đăng nhập và nó thực sự đạt đến mã này).

Intent i = new Intent(); 
i.setAction(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER); 
i.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, "com.example.myapp.livewallpaper.LiveWallpaperService"); 
startActivity(i); 

Nếu bạn cần thêm thông tin mà tôi quên đăng cho tôi biết.

* Tôi cũng biết đây là API 16+, đây chỉ là trường hợp của tôi cho khi điện thoại là API 16+

Trả lời

18

tôi không thể tìm thấy một ví dụ một trong hai. Điều đầu tiên tôi nhận thấy là EXTRA_LIVE_WALLPAPER_COMPONENT không yêu cầu Chuỗi, nhưng là ComponentName. cắt giảm đầu tiên của tôi với ComponentName trông như thế này:

ComponentName component = new ComponentName(getPackageName(), "LiveWallpaperService"); 
intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER); 
intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, component); 
startActivityForResult(intent, REQUEST_SET_LIVE_WALLPAPER); 

Đó không cắt nó, vì vậy tôi đào vào mã nguồn Android và tìm thấy những điều sau đây trong LiveWallpaperChange.java:

Intent queryIntent = new Intent(WallpaperService.SERVICE_INTERFACE); 
queryIntent.setPackage(comp.getPackageName()); 
List<ResolveInfo> list = getPackageManager().queryIntentServices(queryIntent, PackageManager.GET_META_DATA); 

Một gỡ lỗi chút với phía trên đoạn, và đây là hình thức cuối cùng của tôi ...

ComponentName component = new ComponentName(getPackageName(), getPackageName() + ".LiveWallpaperService"); 
intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER); 
intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, component); 
startActivityForResult(intent, REQUEST_SET_LIVE_WALLPAPER); 

Chìa khóa nằm trong tham số thứ hai là ComponentName.

Về mặt kỹ thuật, hình thức cuối cùng của tôi hỗ trợ một hệ thống các phương pháp mới đầu tiên, tiếp theo là cũ, tiếp theo là mục đích cụ thể Nook Tablet/Nook Color:

Intent intent; 

// try the new Jelly Bean direct android wallpaper chooser first 
try { 
    ComponentName component = new ComponentName(getPackageName(), getPackageName() + ".LiveWallpaperService"); 
    intent = new Intent(WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER); 
    intent.putExtra(WallpaperManager.EXTRA_LIVE_WALLPAPER_COMPONENT, component); 
    startActivityForResult(intent, REQUEST_SET_LIVE_WALLPAPER); 
} 
catch (android.content.ActivityNotFoundException e3) { 
    // try the generic android wallpaper chooser next 
    try { 
     intent = new Intent(WallpaperManager.ACTION_LIVE_WALLPAPER_CHOOSER); 
     startActivityForResult(intent, REQUEST_SET_LIVE_WALLPAPER); 
    } 
    catch (android.content.ActivityNotFoundException e2) { 
     // that failed, let's try the nook intent 
     try { 
      intent = new Intent(); 
      intent.setAction("com.bn.nook.CHANGE_WALLPAPER"); 
      startActivity(intent); 
     } 
     catch (android.content.ActivityNotFoundException e) { 
      // everything failed, let's notify the user 
      showDialog(DIALOG_NO_WALLPAPER_PICKER); 
     } 
    } 
} 
+1

Ah, Cảm ơn bạn. Tôi đã chuyển từ triển khai ý tưởng này vì nó chỉ là API 16+, nhưng rất có thể sử dụng mã này vào một ngày sau đó. Cảm ơn câu trả lời mô tả! –

+5

Tôi nhận được một lỗi 12-06 14: 18: 26,936: W/CHANGE_LIVE_WALLPAPER (11898): Không phải là một hình nền sống: ComponentInfo {com.android.noisefield/com.android.noisefield.LiveWallpaperService} Can bạn vui lòng cho tôi biết làm thế nào để thay đổi hình nền nếu tôi không phải là chủ sở hữu của hình nền đó? Thay vì getPackageName() để đặt gói dưới dạng chuỗi? Ví dụ: String packageName = "com.android.noisefield"; Làm thế nào để thay thế packageName bằng getPackageName()? Cảm ơn ngài. – Naskov

Các vấn đề liên quan