2012-05-16 36 views
12

Do this annoying Android limitation Tôi cần người dùng cài đặt lại ứng dụng của mình để các ứng dụng khác phát hiện các quyền đối với tệp kê khai.Cài đặt lại apk ứng dụng lập trình mà không cần tải xuống

Điều này sẽ gây phiền toái cho người dùng, nhưng ngoài ra, tôi không thể thấy cách cài đặt lại ứng dụng từ apk được lưu trữ trong/data/app và do đó tôi phải tải xuống cùng một phiên bản cho bộ nhớ trước khi kích hoạt ý định cài đặt thông thường.

Tôi háo hức chờ ai đó nói với tôi rằng tôi thiếu điều gì đó hiển nhiên! Tôi đã vẽ một ô trống ...

Xin cảm ơn trước.

Vui lòng đánh dấu sao vấn đề nếu bạn muốn xem giải pháp được giải quyết! Chúc mừng.


EDIT: Với ý kiến ​​của @hackbod trong tâm trí, bạn có thể sử dụng đoạn mã sau để bắt đầu cài đặt hộp thoại.

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(Uri.fromFile(new File(this.getApplicationInfo().sourceDir)), 
"application/vnd.android.package-archive"); 
startActivity(intent); 

Trên điện thoại Jelly Bean của tôi, điều này thể hiện hai lựa chọn: cài đặt góiXác minh và cài đặt. Tôi không biết nếu sau này sẽ đối phó với các vấn đề:

  • Cài đặt ứng dụng của bạn theo cách này có thể sẽ loại bỏ quyền sở hữu của nó từ Play Store

Ứng dụng của tôi là miễn phí, vì vậy tôi không thể kiểm tra vấn đề trả tiền của: Tuy nhiên

  • Lưu ý nếu ứng dụng của bạn về phía trước khóa (đó là không thể tránh khỏi đối với tất cả các ứng dụng trả tiền bắt đầu với JB, do sự mã hóa ứng dụng), thì điều này sẽ không làm việc becau ứng dụng của bạn không thể đọc được bởi những người khác

Mặc dù hackbod kết thúc bằng 'mã của người khác có thể đọc được' cho ứng dụng của bạn, nó có thể đọc được không? Vui lòng sửa tôi nếu bạn có thể kiểm tra điều này và tôi đã sai.

+1

Bạn có thể sao chép từ/data/app vào thẻ lưu trữ. Mặc dù bạn không thể duyệt thư mục đó, các tệp mà nó chứa thường có thể đọc được - mặc dù điều đó không được bảo đảm (và đó không phải lúc nào cũng là vị trí cài đặt). Một giải pháp thay thế có thể là không sử dụng hệ thống cấp phép, nhưng cố gắng thực hiện xác thực của riêng bạn về gói yêu cầu. –

+0

Cảm ơn Chris - Ứng dụng của tôi cần được cài đặt trên thiết bị nếu không nó sẽ không hoạt động chính xác, vì vậy tôi đã lo lắng tối thiểu về vị trí cài đặt của người dùng. Tôi cho rằng đó là chỉ xem xét bạn đang đề cập đến? Ngoài ra, vì/data/app có thể đọc được, tôi có thể kiểm tra gói ứng dụng được đặt ở đó trước bất kỳ thứ gì khác. Từ tìm kiếm của tôi, tôi không thể tìm cách chuyển APK từ vị trí đó trừ khi sử dụng chức năng gốc ... Muốn biết nếu có cách nào ... Tôi không chắc chắn ý của bạn là gì? Chúc mừng. – brandall

+0

Nếu nó có thể đọc được (vì nó thường là) bạn không cần root để sao chép nó vào một nơi nào đó bạn được phép ghi vào (chẳng hạn như sdcard, với sự cho phép phù hợp). Tuy nhiên,/dữ liệu/ứng dụng không phải lúc nào cũng được cài đặt. Và đôi khi tên tệp APK được thay đổi trong khi cài đặt. Bạn có thể xác định vị trí và tên được cài đặt từ /data/system/packages.xml nhưng tại thời điểm đó bạn khá sâu vào chức năng nội bộ riêng tư mà có thể không phải là bằng chứng trong tương lai. Thực sự, tải lại có lẽ là đặt cược tốt nhất của bạn - ít nhất, có đó là một tùy chọn dự phòng. –

Trả lời

3

Có thể hiểu rằng bạn chỉ có thể lấy đường dẫn đến tệp .apk của bạn thông qua Context.getApplicationInfo(). SourceDir và khởi chạy trình cài đặt ứng dụng với đường dẫn đó. Tuy nhiên, nếu ứng dụng của bạn bị khóa trước (không thể tránh khỏi đối với tất cả các ứng dụng phải trả phí bắt đầu bằng JB, do mã hóa ứng dụng), thì điều này sẽ không hoạt động vì ứng dụng của bạn không thể đọc được bởi người khác. Trong trường hợp đó, bạn sẽ cần phải sao chép .apk vào một nơi nào đó trên thế giới có thể đọc được (chẳng hạn như trong bộ nhớ ngoài) và cài đặt nó từ đó.

Không có vấn đề gì bạn làm ở đây, tuy nhiên, điều này có một số hậu quả rất tiêu cực không thể tránh khỏi:

  • Cách duy nhất để làm bất kỳ loại cài đặt từ ứng dụng của bạn là phải đi qua giao diện người dùng phụ tải, trong đó là (a) sẽ là một trải nghiệm rất đáng sợ cho người dùng và (b) sẽ yêu cầu người dùng bật tải phụ để có thể tiếp tục.
  • Cài đặt ứng dụng theo cách này có thể sẽ xóa quyền sở hữu ứng dụng khỏi Cửa hàng Play (vì nó không còn là ứng dụng đã cài đặt ứng dụng).Điều này có thể có nghĩa là ví dụ: người dùng không còn có thể báo cáo sự cố hoặc ANR cho bạn thông qua cửa hàng phát hoặc các hậu quả tiêu cực khác. Tôi không chắc chính xác những vấn đề nào sẽ thực sự xảy ra ở đây, nhưng tôi thực sự không cho rằng điều này sẽ ổn.

Cuối cùng, tôi sẽ không khuyên bạn nên làm điều này. Bạn cần sự cho phép nào đang buộc bạn phải làm điều này? Vì nhiều lý do, tôi sẽ không khuyên các ứng dụng của bên thứ ba khai báo quyền riêng của họ trong hầu hết các trường hợp, bởi vì có rất nhiều trải nghiệm người dùng tồi về các quyền chỉ được biết sau khi chúng có thể cần thiết.

+0

Cảm ơn câu trả lời của bạn. Một ví dụ điển hình của vấn đề này là Tasker của ứng dụng, yêu cầu net.dinglisch.android.tasker.PERMISSION_RUN_TASKS. Như tôi chắc chắn bạn biết, Tasker có thể thực hiện một số thay đổi thiết bị chính, do đó, có thể hiểu được lý do tại sao nhà phát triển muốn mang điều này đến sự chú ý của người dùng cài đặt ứng dụng của tôi. Nếu tôi đề xuất với người dùng của tôi rằng họ cài đặt Tasker cho các tính năng tương thích của nó, tôi sau đó được trình bày với tình huống này, nơi các quyền trong Tệp kê khai của tôi không được phát hiện. Tôi không chắc liệu tôi có thể đánh dấu câu trả lời của bạn là 'chính xác' vì dường như không có giải pháp nào không? – brandall

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